void OnEnable()
 {
     _manager = FindObjectOfType <ManipulatorManager>();
     if (_manager != null)
     {
         _manager.Add(this);
     }
 }
    void Update()
    {
        int numManipulators = Mathf.Min(_manipulators.Count, MAX_MANIPULATORS);

        for (int i = 0; i < numManipulators; i++)
        {
            Manipulator manipulator = _manipulators[i];
            _anchorpositions[i] = manipulator.transform.position;
            _hardnesses[i]      = manipulator.hardness;
            _radii[i]           = manipulator.transform.lossyScale.magnitude;

            Quaternion rotation = manipulator.handle.rotation * Quaternion.Inverse(manipulator.transform.rotation);
            float      angle;
            Vector3    axis;
            rotation.ToAngleAxis(out angle, out axis);
            if (angle == 0.0f)
            {
                axis  = new Vector3(1, 0, 0);
                angle = 0.0001f;
            }

            _rotations[i]    = axis * (Mathf.Deg2Rad * angle);
            _scaleFactors[i] = Mathf.Max(Mathf.Max(manipulator.handle.transform.lossyScale.x / manipulator.transform.lossyScale.x, manipulator.handle.transform.lossyScale.y / manipulator.transform.lossyScale.y), manipulator.handle.transform.lossyScale.z / manipulator.transform.lossyScale.z) - 1;
            _translations[i] = manipulator.handle.transform.position - manipulator.transform.position;
        }

        Shader.SetGlobalInt(ShaderParamaters.numManipulatorsID, numManipulators);
        Shader.SetGlobalVectorArray(ShaderParamaters.anchorPositionsID, _anchorpositions);
        Shader.SetGlobalFloatArray(ShaderParamaters.hardnessesID, _hardnesses);
        Shader.SetGlobalFloatArray(ShaderParamaters.radiiID, _radii);
        Shader.SetGlobalVectorArray(ShaderParamaters.RotationsID, _rotations);
        Shader.SetGlobalVectorArray(ShaderParamaters.TranslationsID, _translations);
        Shader.SetGlobalFloatArray(ShaderParamaters.ScaleFactorsID, _scaleFactors);

        ManipulatorManager.SetKeyword(ShaderParamaters.VISUALIZE_FALLOFF, _visualizeFalloff);
        ManipulatorManager.SetKeyword(ShaderParamaters.DEBUG_NORMALS, _debugNormals);
        ManipulatorManager.SetKeyword(ShaderParamaters.CORRECT_NORMALS, _correctNormals);
    }