예제 #1
0
        internal VideoEnumerator GetFrames(string fileName, bool clone, out bool video, out PixelInternalFormat?internalFormat)
        {
            if (string.IsNullOrEmpty(fileName))
            {
                throw new InvalidOperationException(string.Format(
                                                        "A valid movie file or image sequence path was not specified for texture \"{0}\".",
                                                        Name));
            }

            var capture = Capture.CreateFileCapture(fileName);

            if (capture == null)
            {
                throw new InvalidOperationException(string.Format(
                                                        "Failed to load image sequence \"{0}\" from the specified path: \"{1}\".",
                                                        Name, fileName));
            }

            var extension = Path.GetExtension(fileName);

            video = Array.FindIndex(ImageExtensions, ext => extension.Contains(ext)) < 0;

            var flipMode   = FlipMode;
            var offset     = StartPosition;
            var frameCount = (int)capture.GetProperty(CaptureProperty.FrameCount);

            frameCount = FrameCount.HasValue ? Math.Min(FrameCount.Value, frameCount) : frameCount;
            var width  = Width.GetValueOrDefault((int)capture.GetProperty(CaptureProperty.FrameWidth));
            var height = Height.GetValueOrDefault((int)capture.GetProperty(CaptureProperty.FrameHeight));

            internalFormat = width > 0 && height > 0 ? (PixelInternalFormat?)null : InternalFormat;
            return(new VideoEnumerator(capture, width, height, offset, frameCount, flipMode, clone));
        }
예제 #2
0
        /// <summary>
        /// Gets the orientation.
        /// </summary>
        /// <returns>Unknown, Portrait, Landscape, or Square</returns>
        public string GetOrientation()
        {
            int height = Height.GetValueOrDefault();
            int width  = Width.GetValueOrDefault();

            if (height == 0 && width == 0)
            {
                return("Unknown");
            }

            if (height > width)
            {
                return("Portrait");
            }

            if (width > height)
            {
                return("Landscape");
            }

            if (width == height)
            {
                return("Square");
            }

            return("Unknown");
        }
예제 #3
0
        public MetadataInfoTreeContainer EditInfo(MetadataInfoTreeContainer infoToUpdate, List <MetadataInfoTreeContainer> suppliedInfo)
        {
            infoToUpdate.VideoStream.VideoMetadata.Width       = Width.GetValueOrDefault();
            infoToUpdate.VideoStream.VideoMetadata.Height      = Height.GetValueOrDefault();
            infoToUpdate.VideoStream.VideoMetadata.CodedWidth  = Width.GetValueOrDefault();
            infoToUpdate.VideoStream.VideoMetadata.CodedHeight = Height.GetValueOrDefault();

            return(infoToUpdate);
        }
예제 #4
0
        public override Texture CreateResource(ResourceManager resourceManager)
        {
            var texture = new Texture();
            var width   = Width.GetValueOrDefault();
            var height  = Height.GetValueOrDefault();

            ConfigureTexture(texture, width, height);
            GL.BindTexture(TextureTarget.Texture2D, 0);
            return(texture);
        }
예제 #5
0
        /// <summary>
        /// Gets friendly representation of asset dimensions. eg. 10 (h) x 5 (w)
        /// </summary>
        /// <returns></returns>
        public string GetDimensions()
        {
            if (!IsProcessed)
            {
                return("being processed...");
            }

            int height = Height.GetValueOrDefault();
            int width  = Width.GetValueOrDefault();

            if (height == 0 && width == 0)
            {
                return("unknown");
            }

            return(string.Format("{0} (h) x {1} (w)", height, width));
        }
예제 #6
0
        public override Texture CreateResource(ResourceManager resourceManager)
        {
            var fileName = FileName;

            if (string.IsNullOrEmpty(fileName))
            {
                throw new InvalidOperationException(string.Format(
                                                        "A valid image file path was not specified for texture \"{0}\".",
                                                        Name));
            }

            var texture = base.CreateResource(resourceManager);
            var image   = CV.LoadImage(fileName, ColorType);

            if (image == null)
            {
                throw new InvalidOperationException(string.Format(
                                                        "Failed to load image texture \"{0}\" from the specified path: \"{1}\".",
                                                        Name, fileName));
            }

            var width  = Width.GetValueOrDefault();
            var height = Height.GetValueOrDefault();

            if (width > 0 && height > 0 && (image.Width != width || image.Height != height))
            {
                var resized = new IplImage(new Size(width, height), image.Depth, image.Channels);
                CV.Resize(image, resized);
                image = resized;
            }

            var flipMode = FlipMode;

            if (flipMode.HasValue)
            {
                CV.Flip(image, null, flipMode.Value);
            }
            GL.BindTexture(TextureTarget.Texture2D, texture.Id);
            var internalFormat = width > 0 && height > 0 ? (PixelInternalFormat?)null : InternalFormat;

            TextureHelper.UpdateTexture(TextureTarget.Texture2D, internalFormat, image);
            GL.BindTexture(TextureTarget.Texture2D, 0);
            return(texture);
        }
예제 #7
0
        public override Texture CreateResource(ResourceManager resourceManager)
        {
            var texture = new Texture();

            GL.BindTexture(TextureTarget.Texture2D, texture.Id);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)WrapS);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)WrapT);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)MinFilter);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)MagFilter);
            var width  = Width.GetValueOrDefault();
            var height = Height.GetValueOrDefault();

            if (width > 0 && height > 0)
            {
                GL.TexImage2D(TextureTarget.Texture2D, 0, InternalFormat, width, height, 0, PixelFormat.Bgr, PixelType.UnsignedByte, IntPtr.Zero);
            }
            GL.BindTexture(TextureTarget.Texture2D, 0);
            return(texture);
        }
예제 #8
0
        public override IObservable <Texture> Process <TSource>(IObservable <TSource> source)
        {
            return(Observable.Defer(() =>
            {
                var fbo = 0;
                var width = 0;
                var height = 0;
                var depthRenderbuffer = 0;
                var colorTarget = default(Texture);
                return source.CombineEither(
                    ShaderManager.WindowSource.Do(window =>
                {
                    window.Update(() =>
                    {
                        width = Width.GetValueOrDefault(window.Width);
                        height = Height.GetValueOrDefault(window.Height);
                        GL.GenFramebuffers(1, out fbo);
                        GL.GenRenderbuffers(1, out depthRenderbuffer);
                        GL.BindFramebuffer(FramebufferTarget.Framebuffer, fbo);
                        GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthRenderbuffer);
                        GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent, width, height);
                        GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, RenderbufferTarget.Renderbuffer, depthRenderbuffer);
                        colorTarget = CreateRenderTarget(width, height, InternalFormat, PixelFormat.Rgba, PixelType.UnsignedByte);
                        GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, colorTarget.Id, 0);
                        GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, 0);
                        GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
                    });
                }),
                    (input, window) =>
                {
                    foreach (var state in renderState)
                    {
                        state.Execute(window);
                    }

                    var clearMask = ClearMask;
                    GL.BindFramebuffer(FramebufferTarget.Framebuffer, fbo);
                    window.UpdateViewport(width, height);
                    window.UpdateScissor(width, height);
                    if (clearMask != ClearBufferMask.None)
                    {
                        GL.ClearColor(ClearColor);
                        GL.Clear(clearMask);
                    }

                    foreach (var shader in window.Shaders)
                    {
                        shader.Dispatch();
                    }

                    window.UpdateViewport();
                    window.UpdateScissor();
                    GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
                    return colorTarget;
                }).Finally(() =>
                {
                    if (fbo > 0)
                    {
                        GL.DeleteFramebuffers(1, ref fbo);
                        GL.DeleteRenderbuffers(1, ref depthRenderbuffer);
                        colorTarget.Dispose();
                    }
                });
            }));
        }