예제 #1
0
        /// <summary>
        /// Стандартный конструктор
        /// </summary>
        /// <param name="parActualAssetMetadata">Метаданные об ассете</param>
        /// <param name="parBinaryData">Данные текстуры в бинарном виде</param>
        public AssetDataOpenTkTexture(AssetMetadata parActualAssetMetadata, byte[] parBinaryData) : base(
                parActualAssetMetadata)
        {
            OpenGlCommandsInternalHandler.AddGlCommand(() =>
            {
                using (MemoryStream ms = new MemoryStream(parBinaryData))
                {
                    LinkedBitmap = new Bitmap(ms);
                }

                GlTextureId = GL.GenTexture();
                GL.BindTexture(TextureTarget.Texture2D, GlTextureId);

                BitmapData data = LinkedBitmap.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly,
                                                        PixelFormat.Format32bppArgb);

                GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
                              OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);

                LinkedBitmap.UnlockBits(data);

                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS,
                                (int)TextureWrapMode.Clamp);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT,
                                (int)TextureWrapMode.Clamp);

                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter,
                                (int)TextureMinFilter.Linear);
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter,
                                (int)TextureMinFilter.Linear);

                Console.WriteLine($"GL: Texture {GlTextureId} created in memory");
            });
        }
예제 #2
0
        /// <summary>
        /// Переопределение деструктора
        /// </summary>
        /// <param name="parDisposing">Флаг-признак уничтожения (формальный параметр)</param>
        protected override void Dispose(bool parDisposing)
        {
            if (IsDisposed)
            {
                return;
            }

            if (parDisposing)
            {
                OpenGlCommandsInternalHandler.AddGlCommand(() =>
                {
                    // освобождаем ресурсы
                    // отменяем привязку текстуры и уничтожаем bitmap
                    GL.BindTexture(TextureTarget.Texture2D, 0);
                    GL.DeleteTexture(GlTextureId);
                    LinkedBitmap.Dispose();

                    Console.WriteLine($"GL: Texture {GlTextureId} removed from memory");
                });
            }

            IsDisposed = true;
        }