/// <summary>
    /// Unregisters the shadow in the system.
    /// </summary>
    /// <param name="shadow">
    /// The shadow to unregister.
    /// </param>
    public void UnregisterShadow(SwiftShadow shadow)
    {
        SS_ShadowMeshManager meshManager;
        bool isExists = _meshManagers.TryGetValue(shadow.GetMeshManagerHashCode(), out meshManager);

        if (isExists)
        {
            meshManager.UnregisterShadow(shadow);
        }
    }
    /// <summary>
    /// Returns the mesh managers suitable for a shadow.
    /// </summary>
    /// <param name="shadow">
    /// The shadow to get mesh manager for.
    /// </param>
    /// <returns>
    /// The <see cref="SS_ShadowMeshManager"/>.
    /// </returns>
    private SS_ShadowMeshManager GetMeshManager(SwiftShadow shadow)
    {
        SS_ShadowMeshManager meshManager;
        bool isExists = _meshManagers.TryGetValue(shadow.GetMeshManagerHashCode(), out meshManager);

        if (isExists)
        {
            return(meshManager);
        }

        if (shadow.Material == null)
        {
            throw new ArgumentNullException("shadow.Material");
        }

        meshManager = new SS_ShadowMeshManager(shadow.Material, shadow.Layer, shadow.IsStatic);
        _meshManagers.Add(meshManager.GetInstanceHashCode(), meshManager);
        if (_isRecalculatingMesh)
        {
            _meshManagersNew.Add(meshManager);
        }

        return(meshManager);
    }
    /// <summary>
    /// Returns the mesh managers suitable for a shadow.
    /// </summary>
    /// <param name="shadow">
    /// The shadow to get mesh manager for.
    /// </param>
    /// <returns>
    /// The <see cref="SS_ShadowMeshManager"/>.
    /// </returns>
    private SS_ShadowMeshManager GetMeshManager(SwiftShadow shadow) {
        SS_ShadowMeshManager meshManager;
        bool isExists = _meshManagers.TryGetValue(shadow.GetMeshManagerHashCode(), out meshManager);
        if (isExists) {
            return meshManager;
        }

        if (shadow.Material == null)
            throw new ArgumentNullException("shadow.Material");

        meshManager = new SS_ShadowMeshManager(shadow.Material, shadow.Layer, shadow.IsStatic);
        _meshManagers.Add(meshManager.GetInstanceHashCode(), meshManager);
        if (_isRecalculatingMesh) {
            _meshManagersNew.Add(meshManager);
        }

        return meshManager;
    }
    /// <summary>
    /// Unregisters the shadow in the system.
    /// </summary>
    /// <param name="shadow">
    /// The shadow to unregister.
    /// </param>
    public void UnregisterShadow(SwiftShadow shadow) {
        SS_ShadowMeshManager meshManager;
        bool isExists = _meshManagers.TryGetValue(shadow.GetMeshManagerHashCode(), out meshManager);

        if (isExists) {
            meshManager.UnregisterShadow(shadow);
        }
    }