Ejemplo n.º 1
0
        public override IObservable <IplImage> Process(IObservable <IplImage> source)
        {
            return(Observable.Create <IplImage>(observer =>
            {
                var name = TextureName;
                var texture = default(Texture);
                var textureSize = default(Size);
                if (string.IsNullOrEmpty(name))
                {
                    throw new InvalidOperationException("A texture name must be specified.");
                }

                return source.CombineEither(
                    ShaderManager.WindowSource.Do(window =>
                {
                    window.Update(() =>
                    {
                        try { texture = window.ResourceManager.Load <Texture>(name); }
                        catch (Exception ex) { observer.OnError(ex); }
                    });
                }),
                    (input, window) =>
                {
                    window.Update(() =>
                    {
                        var target = TextureTarget;
                        if (target > TextureTarget.TextureBindingCubeMap && target < TextureTarget.ProxyTextureCubeMap)
                        {
                            GL.BindTexture(TextureTarget.TextureCubeMap, texture.Id);
                        }
                        else
                        {
                            GL.BindTexture(target, texture.Id);
                        }
                        var internalFormat = textureSize != input.Size ? InternalFormat : (PixelInternalFormat?)null;
                        TextureHelper.UpdateTexture(target, internalFormat, input);
                        textureSize = input.Size;
                    });
                    return input;
                }).SubscribeSafe(observer);
            }));
        }