/// <summary>
        ///     Called by code which actually renders the dynamic texture to supply texture data.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="data"></param>
        public void ReturnData(UUID id, byte [] data)
        {
            DynamicTextureUpdater updater = null;

            lock (Updaters) {
                if (Updaters.ContainsKey(id))
                {
                    updater = Updaters [id];
                }
            }

            if (updater != null)
            {
                updater.DataReceived(data, m_scene);

                if (updater.UpdateTimer == 0)
                {
                    lock (Updaters) {
                        if (!Updaters.ContainsKey(updater.UpdaterID))
                        {
                            Updaters.Remove(updater.UpdaterID);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Called by code which actually renders the dynamic texture to supply texture data.
        /// </summary>
        /// <param name="updaterId"></param>
        /// <param name="texture"></param>
        public void ReturnData(UUID updaterId, IDynamicTexture texture)
        {
            DynamicTextureUpdater updater = null;

            if (Updaters.TryGetValue(updaterId, out updater))
            {
                Scene scene;
                if (RegisteredScenes.TryGetValue(updater.SimUUID, out scene))
                {
                    UUID newTextureID = updater.DataReceived(texture.Data, scene);

                    if (ReuseTextures &&
                        !updater.BlendWithOldTexture &&
                        texture.IsReuseable &&
                        (ReuseLowDataTextures || IsDataSizeReuseable(texture)))
                    {
                        m_reuseableDynamicTextures[GenerateReusableTextureKey(texture.InputCommands, texture.InputParams)] = newTextureID;
                    }
                }
            }

            if (updater.UpdateTimer == 0)
            {
                Updaters.Remove(updater.UpdaterID);
            }
        }
        /// <summary>
        /// Called by code which actually renders the dynamic texture to supply texture data.
        /// </summary>
        /// <param name="updaterId"></param>
        /// <param name="texture"></param>
        public void ReturnData(UUID updaterId, IDynamicTexture texture)
        {
            DynamicTextureUpdater updater = null;

            lock (Updaters)
            {
                if (Updaters.ContainsKey(updaterId))
                {
                    updater = Updaters[updaterId];
                }
            }

            if (updater != null)
            {
                if (RegisteredScenes.ContainsKey(updater.SimUUID))
                {
                    Scene scene        = RegisteredScenes[updater.SimUUID];
                    UUID  newTextureID = updater.DataReceived(texture.Data, scene);

                    if (ReuseTextures &&
                        !updater.BlendWithOldTexture &&
                        texture.IsReuseable &&
                        (ReuseLowDataTextures || IsDataSizeReuseable(texture)))
                    {
                        m_reuseableDynamicTextures.Store(
                            GenerateReusableTextureKey(texture.InputCommands, texture.InputParams), newTextureID);
                    }
                }
            }

            if (updater.UpdateTimer == 0)
            {
                lock (Updaters)
                {
                    if (!Updaters.ContainsKey(updater.UpdaterID))
                    {
                        Updaters.Remove(updater.UpdaterID);
                    }
                }
            }
        }