コード例 #1
0
        public static void createDisplay(bool VSync = false,int FPSCap = 60)
        {
            try
            {
                //Configure the settings of the Window
                ContextSettings settings = new ContextSettings(24, 8, 4, 3, 2);
                window = new RenderWindow(new VideoMode(Convert.ToUInt32(WIDTH), Convert.ToUInt32(HEIGHT)), "OpenGL", Styles.Default, settings);
                Logger.Log(window.Settings.ToString(), Logger.Symbols.Warning);
                if (VSync)
                {
                    window.SetVerticalSyncEnabled(VSync);
                }else
                {
                    window.SetFramerateLimit(Convert.ToUInt32(FPSCap));
                }
                //Setup EventHandler
                window.Closed += new EventHandler(OnClosed);
                window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);
                window.Resized += new EventHandler<SizeEventArgs>(OnResized);

                //Init OpenTK
                Toolkit.Init();
                OpenTK.Graphics.GraphicsContext context = new OpenTK.Graphics.GraphicsContext(new ContextHandle(IntPtr.Zero), null);
                GL.Viewport(0, 0, WIDTH, HEIGHT);
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e.StackTrace);
            }
        }
コード例 #2
0
        public int createSolidTexture(Vector4 color)
        {
            byte[]      data;
            List <byte> pixels = new List <byte>();

            pixels.Add((byte)color.X);
            pixels.Add((byte)color.Y);
            pixels.Add((byte)color.Z);
            pixels.Add((byte)color.W);

            data = pixels.ToArray();

            var context = new OpenTK.Graphics.GraphicsContext(AlethaApplication.GraphicsMode, AlethaApplication.NativeWindowContext.WindowInfo);

            context.MakeCurrent(AlethaApplication.NativeWindowContext.WindowInfo);

            int texture = GL.GenTexture();

            GL.BindTexture(TextureTarget.Texture2D, texture);
            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, 1, 1, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Rgba, PixelType.UnsignedByte, data);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
            GL.BindTexture(TextureTarget.Texture2D, 0);

            return(texture);
        }
コード例 #3
0
ファイル: Skybox.cs プロジェクト: geralltf/alethaCS
        public static skybox loadFromShader(shader_p surface, shader_gl shader)
        {
            skybox sky = new skybox();

            var context = new OpenTK.Graphics.GraphicsContext(AlethaApplication.GraphicsMode, AlethaApplication.NativeWindowContext.WindowInfo);

            context.MakeCurrent(AlethaApplication.NativeWindowContext.WindowInfo);

            // determine type of skybox: number of textures to load

            //sky.type = skybox_type.one_tex;


            buildSkyboxbuffers();


            loadSkyTexture(shader, surface, (int texture) =>
            {
                //.skymap = texture;
            },
                           (int texture) =>
            {
                sky.skymap = texture;

                //GL.GenerateMipmap(GenerateMipmapTarget.TextureCubeMap);
            });

            return(sky);
        }
コード例 #4
0
ファイル: Window.cs プロジェクト: coolzoom/stride
        /// <summary>
        /// Initializes a new instance of the <see cref="Window"/> class with <paramref name="title"/> as the title of the Window.
        /// </summary>
        /// <param name="title">Title of the window, see Text property.</param>
        public Window(string title)
        {
#if STRIDE_GRAPHICS_API_OPENGL
            var flags = SDL.SDL_WindowFlags.SDL_WINDOW_HIDDEN | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL;
#elif STRIDE_GRAPHICS_API_VULKAN
            var flags = SDL.SDL_WindowFlags.SDL_WINDOW_HIDDEN | SDL.SDL_WindowFlags.SDL_WINDOW_VULKAN;
#else
            var flags = SDL.SDL_WindowFlags.SDL_WINDOW_HIDDEN;
#endif
            // Create the SDL window and then extract the native handle.
            SdlHandle = SDL.SDL_CreateWindow(title, SDL.SDL_WINDOWPOS_UNDEFINED, SDL.SDL_WINDOWPOS_UNDEFINED, 640, 480, flags);

            if (SdlHandle == IntPtr.Zero)
            {
                throw new Exception("Cannot allocate SDL Window: " + SDL.SDL_GetError());
            }
            else
            {
                SDL.SDL_SysWMinfo info = default(SDL.SDL_SysWMinfo);
                SDL.SDL_VERSION(out info.version);
                if (SDL.SDL_GetWindowWMInfo(SdlHandle, ref info) == SDL.SDL_bool.SDL_FALSE)
                {
                    throw new Exception("Cannot get Window information: " + SDL.SDL_GetError());
                }
                else if (Core.Platform.Type == Core.PlatformType.Windows)
                {
                    Handle = info.info.win.window;
                }
                else if (Core.Platform.Type == Core.PlatformType.Linux)
                {
                    Handle  = info.info.x11.window;
                    Display = info.info.x11.display;
                }
                else if (Core.Platform.Type == Core.PlatformType.macOS)
                {
                    Handle = info.info.cocoa.window;
                }
                Application.RegisterWindow(this);
                Application.ProcessEvents();

#if STRIDE_GRAPHICS_API_OPENGL
                glContext = SDL.SDL_GL_CreateContext(SdlHandle);
                if (glContext == IntPtr.Zero)
                {
                    throw new Exception("Cannot create OpenGL context: " + SDL.SDL_GetError());
                }

                // The external context must be made current to initialize OpenGL
                SDL.SDL_GL_MakeCurrent(SdlHandle, glContext);

                // Create a dummy OpenTK context, that will be used to call some OpenGL features
                // we need to later create the various context in GraphicsDevice.OpenGL.
                DummyGLContext = new OpenTK.Graphics.GraphicsContext(new OpenTK.ContextHandle(glContext), SDL.SDL_GL_GetProcAddress, () => new OpenTK.ContextHandle(SDL.SDL_GL_GetCurrentContext()));
#endif
            }
        }
コード例 #5
0
ファイル: GraphicsContext.cs プロジェクト: Daramkun/Misty
        public GraphicsContext( IGraphicsDevice graphicsDevice, bool isImmediate )
        {
            GraphicsDevice = graphicsDevice;
            CullMode = CullMode.ClockWise;

            if ( isImmediate )
                graphicsContext = OpenTK.Graphics.GraphicsContext.CurrentContext as OpenTK.Graphics.GraphicsContext;
            else
                graphicsContext = new OpenTK.Graphics.GraphicsContext ( new OpenTK.Graphics.GraphicsMode ( new OpenTK.Graphics.ColorFormat ( 8, 8, 8, 8 ), 24, 8 ),
                    ( graphicsDevice.Handle as OpenTK.GameWindow ).WindowInfo );
        }
コード例 #6
0
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            var time = new TimeMonitor(1000);

            // Request a 32-bits depth buffer when creating the window
            var contextSettings = new ContextSettings {
                DepthBits = 32
            };

            // Create the main window
            var window = new RenderWindow(new VideoMode(1600, 900), "TenSeconds", Styles.Close | Styles.Titlebar, contextSettings);

            // Make it the active window for OpenGL calls
            window.SetActive();

            var windowInfo      = OpenTK.Platform.Utilities.CreateWindowsWindowInfo(window.SystemHandle);
            var graphicsContext = new OpenTK.Graphics.GraphicsContext(OpenTK.Graphics.GraphicsMode.Default, windowInfo);

            graphicsContext.MakeCurrent(windowInfo);
            graphicsContext.LoadAll();

            // Setup event handlers
            window.Closed     += OnClosed;
            window.KeyPressed += OnKeyPressed;
            window.Resized    += OnResized;

            var inputManager = new InputManager();

            inputManager.Init(window);
            var game = new Game();

            game.Init(window);

            while (window.IsOpen() && game.IsRunning)
            {
                time.Update();

                // Process events
                window.DispatchEvents();

                inputManager.Update(window);
                game.HandleInput(inputManager);

                game.Update(time);

                // Clear color and depth buffer
                GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
                game.Draw(window);

                // Finally, display the rendered frame on screen
                window.Display();
            }
        }
コード例 #7
0
        public static void CreateGLESContext()
        {
            //make open gl es current context 
            GlfwWindowPtr currentContext = Glfw.GetCurrentContext();
            _glContextHandler = new OpenTK.ContextHandle(currentContext.inner_ptr);

            _glfwContextForOpenTK = new GLFWContextForOpenTK(_glContextHandler);
            _externalContext = OpenTK.Graphics.GraphicsContext.CreateExternalContext(_glfwContextForOpenTK);

            //glfwContext = OpenTK.Graphics.GraphicsContext.CreateDummyContext(contextHandler);
            bool isCurrent = _glfwContextForOpenTK.IsCurrent;
        }
コード例 #8
0
        public static void CreateGLESContext()
        {
            //make open gl es current context
            GlfwWindowPtr currentContext = Glfw.GetCurrentContext();

            _glContextHandler = new OpenTK.ContextHandle(currentContext.inner_ptr);

            _glfwContextForOpenTK = new GLFWContextForOpenTK(_glContextHandler);
            _externalContext      = OpenTK.Graphics.GraphicsContext.CreateExternalContext(_glfwContextForOpenTK);

            //glfwContext = OpenTK.Graphics.GraphicsContext.CreateDummyContext(contextHandler);
            bool isCurrent = _glfwContextForOpenTK.IsCurrent;
        }
コード例 #9
0
        private void InitializeOgl(Control WinControl)
        {
            if (RenderingContext != null)
            {
                if (!RenderingContext.IsDisposed)
                {
                    DisposeOglObjects();
                }
            }


            /* private OpenTK.Platform.IWindowInfo*/
            WindowsInfo = OpenTK.Platform.Utilities.CreateWindowsWindowInfo(WinControl.Handle);

            OpenTK.Graphics.GraphicsMode GraphicMode = new OpenTK.Graphics.GraphicsMode(new OpenTK.Graphics.ColorFormat(PfdColorBits), PfdDepthBits, PfdStencilBits, PfdAuxBits, new OpenTK.Graphics.ColorFormat(PfdAccumBits), PfdBuffers, PfdStereo);

            OpenTK.Graphics.GraphicsMode GraphicMode2 = OpenTK.Graphics.GraphicsMode.Default;
            RenderingContext = new OpenTK.Graphics.GraphicsContext(GraphicMode2, WindowsInfo);
            RenderingContext.LoadAll();
            FBO.LoadMethods();
            RenderingContext.SwapInterval = 1;
            GL.Enable(EnableCap.DepthTest);
            GL.DepthFunc(DepthFunction.Lequal);
            GL.CullFace(CullFaceMode.Back);
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
            GL.ShadeModel(ShadingModel.Smooth);
            GL.Enable(EnableCap.Normalize);
            GL.Enable(EnableCap.Texture2D);
            GL.Enable(EnableCap.Lighting);

            ShadowMapSampler = GL.GenSampler();
            //  Texture.Sampler= GL.GenSampler();
            ActivateShader();
            Lights[0].Position     = new xyzwf(3, 4, 10, 0);
            FieldOfView            = 0;
            Selector.PickingShader = PickingShader;
            //System.Diagnostics.ConsoleTraceListener myWriter = new
            //System.Diagnostics.ConsoleTraceListener();

            //System.Diagnostics.Debug.Listeners.Clear();
            //System.Diagnostics.Debug.Listeners.Add(myWriter);
            CheckError();


            ClockWise = true;
            Culling   = false;

            SwapBuffers();
            CheckError();
        }
コード例 #10
0
        private void DisposeOglObjects()
        {
            BackGroundShader.Dispose();
            if (Selector.PickingShader != null)
            {
                Selector.PickingShader.Dispose();
                Selector.PickingShader = null;
            }

            Selector.PickingShader = null;

            RenderingContext.Dispose();
            RenderingContext = null;
        }
コード例 #11
0
 protected override void OnHandleDestroyed(EventArgs e)
 {
     base.OnHandleDestroyed(e);
     if (graphicsContext != null)
     {
         graphicsContext.Dispose();
         graphicsContext = null;
     }
     if (windowInfo != null)
     {
         windowInfo.Dispose();
         windowInfo = null;
     }
 }
コード例 #12
0
ファイル: Window.cs プロジェクト: cg123/xenko
        /// <summary>
        /// Initialize current instance with <paramref name="title"/> as the title of the Window.
        /// </summary>
        /// <param name="title">Title of the window, see Text property.</param>
        public Window(string title)
        {
#if SILICONSTUDIO_XENKO_GRAPHICS_API_OPENGL
            var flags = SDL.SDL_WindowFlags.SDL_WINDOW_HIDDEN | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL;
#else
            var flags = SDL.SDL_WindowFlags.SDL_WINDOW_HIDDEN;
#endif
            // Create the SDL window and then extract the native handle.
            SdlHandle = SDL.SDL_CreateWindow(title, SDL.SDL_WINDOWPOS_UNDEFINED, SDL.SDL_WINDOWPOS_UNDEFINED, 640, 480, flags);

            if (SdlHandle == IntPtr.Zero)
            {
                throw new Exception("Cannot allocate SDL Window: " + SDL.SDL_GetError()); 
            }
            else
            {
                SDL.SDL_SysWMinfo info = default(SDL.SDL_SysWMinfo);
                SDL.SDL_VERSION(out info.version);
                if (SDL.SDL_GetWindowWMInfo(SdlHandle, ref info) == SDL.SDL_bool.SDL_FALSE)
                {
                    throw new Exception("Cannot get Window information: " + SDL.SDL_GetError());
                }
                else
                {
#if SILICONSTUDIO_PLATFORM_WINDOWS_DESKTOP
                    Handle = info.info.win.window;
#elif SILICONSTUDIO_PLATFORM_LINUX
                    Handle = info.info.x11.window;
#endif
                }
                Application.RegisterWindow(this);
                Application.ProcessEvents();

#if SILICONSTUDIO_XENKO_GRAPHICS_API_OPENGL
                glContext = SDL.SDL_GL_CreateContext(SdlHandle);
                if (glContext == IntPtr.Zero)
                {
                    throw new Exception("Cannot create OpenGL context: " + SDL.SDL_GetError());
                }

                // The external context must be made current to initialize OpenGL
                SDL.SDL_GL_MakeCurrent(SdlHandle, glContext);

                // Create a dummy OpenTK context, that will be used to call some OpenGL features
                // we need to later create the various context in GraphicsDevice.OpenGL.
                DummyGLContext = new OpenTK.Graphics.GraphicsContext(new OpenTK.ContextHandle(glContext), SDL.SDL_GL_GetProcAddress, () => new OpenTK.ContextHandle(SDL.SDL_GL_GetCurrentContext()));
#endif
            }
        }
コード例 #13
0
 protected override void OnHandleCreated(EventArgs e)
 {
     base.OnHandleCreated(e);
     windowInfo      = OpenTK.Platform.Utilities.CreateWindowsWindowInfo(Handle);
     graphicsContext = new OpenTK.Graphics.GraphicsContext(graphicsMode, windowInfo, major, minor, graphicsContextFlags);
     graphicsContext.MakeCurrent(windowInfo);
     graphicsContext.LoadAll();
     graphicsContext.SwapInterval = VSync ? 1 : 0;
     if (platformRenderContext == null)
     {
         platformRenderContext = new Graphics.Platform.OpenGL.PlatformRenderContext();
         PlatformRenderer.Initialize(platformRenderContext);
     }
     graphicsContext.MakeCurrent(null);
 }
コード例 #14
0
        public static void LoadComplete(int index, TextureTarget target, OnTextueLoad onloadComplete) // OnSkymapLoadComplete
        {
            var context = new OpenTK.Graphics.GraphicsContext(AlethaApplication.GraphicsMode, AlethaApplication.NativeWindowContext.WindowInfo);

            context.MakeCurrent(AlethaApplication.NativeWindowContext.WindowInfo);

            int skybox = GL.GenTexture();

            index  = skybox;
            skymap = skybox;
            System.Drawing.Imaging.BitmapData xposd, yposd, zposd, xnegd, ynegd, znegd;



            //gl.enable(RenderingContext.TEXTURE_CUBE_MAP);
            GL.BindTexture(TextureTarget.TextureCubeMap, skybox);

            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter, (int)TextureMinFilter.Linear);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);

            //gl.TexParameter(RenderingContext.TEXTURE_CUBE_MAP, RenderingContext.TEXTURE_WRAP_R, RenderingContext.CLAMP_TO_EDGE);

            int level = 0;
            PixelInternalFormat format  = PixelInternalFormat.Rgba;
            PixelFormat         pformat = PixelFormat.Rgba;
            PixelType           type    = PixelType.UnsignedByte;

            xposd = texture.UnlockBitmap(xpos);
            yposd = texture.UnlockBitmap(ypos);
            zposd = texture.UnlockBitmap(zpos);
            xnegd = texture.UnlockBitmap(xneg);
            ynegd = texture.UnlockBitmap(yneg);
            znegd = texture.UnlockBitmap(zneg);

            // gl.texImage2D(RenderingContext.TEXTURE_2D, 0, RenderingContext.RGBA, RenderingContext.RGBA, RenderingContext.UNSIGNED_BYTE, image);
            GL.TexImage2D(TextureTarget.TextureCubeMapPositiveX, level, format, xpos.Width, xpos.Height, 0, pformat, type, xposd.Scan0);
            GL.TexImage2D(TextureTarget.TextureCubeMapNegativeX, level, format, xneg.Width, xneg.Height, 0, pformat, type, xnegd.Scan0);
            GL.TexImage2D(TextureTarget.TextureCubeMapPositiveY, level, format, ypos.Width, ypos.Height, 0, pformat, type, yposd.Scan0);
            GL.TexImage2D(TextureTarget.TextureCubeMapNegativeY, level, format, yneg.Width, yneg.Height, 0, pformat, type, ynegd.Scan0);
            GL.TexImage2D(TextureTarget.TextureCubeMapPositiveZ, level, format, zpos.Width, zpos.Height, 0, pformat, type, zposd.Scan0);
            GL.TexImage2D(TextureTarget.TextureCubeMapNegativeZ, level, format, zneg.Width, zneg.Height, 0, pformat, type, znegd.Scan0);

            onloadComplete(skybox);
        }
コード例 #15
0
        public override Gk3Main.Graphics.IRenderer CreateRenderer()
        {
            if (_renderer != null)
            {
                throw new InvalidOperationException("A renderer has already been created");
            }

            OpenTK.Graphics.GraphicsMode mode = new OpenTK.Graphics.GraphicsMode(new OpenTK.Graphics.ColorFormat(32), _depth, 0, 0);
            _window         = new OpenTK.NativeWindow(_width, _height, "FreeGeeKayThree - OpenGL 3.3 renderer", _fullscreen ? OpenTK.GameWindowFlags.Fullscreen : OpenTK.GameWindowFlags.FixedWindow, mode, OpenTK.DisplayDevice.Default);
            _window.Visible = true;
            _window.Closed += (x, y) => _closed = true;

            _context = new OpenTK.Graphics.GraphicsContext(mode, _window.WindowInfo, 3, 3, OpenTK.Graphics.GraphicsContextFlags.ForwardCompatible | OpenTK.Graphics.GraphicsContextFlags.Debug);
            _context.MakeCurrent(_window.WindowInfo);
            _context.LoadAll();

            _renderer = new Gk3Main.Graphics.OpenGl.OpenGLRenderer(this);

            return(_renderer);
        }
コード例 #16
0
ファイル: Rendering.cs プロジェクト: robincornelius/radegast
        void TextureThread()
        {
            OpenTK.INativeWindow window = new OpenTK.NativeWindow();
            OpenTK.Graphics.IGraphicsContext context = new OpenTK.Graphics.GraphicsContext(GLMode, window.WindowInfo);
            context.MakeCurrent(window.WindowInfo);
            TextureThreadContextReady.Set();
            PendingTextures.Open();
            Logger.DebugLog("Started Texture Thread");

            while (window.Exists && TextureThreadRunning)
            {
                window.ProcessEvents();

                TextureLoadItem item = null;

                if (!PendingTextures.Dequeue(Timeout.Infinite, ref item)) continue;

                // Already have this one loaded
                if (item.Data.TextureInfo.TexturePointer != 0) continue;

                byte[] imageBytes = null;
                if (item.TGAData != null)
                {
                    imageBytes = item.TGAData;
                }
                else if (item.TextureData != null || item.LoadAssetFromCache)
                {
                    if (item.LoadAssetFromCache)
                    {
                        item.TextureData = Client.Assets.Cache.GetCachedAssetBytes(item.Data.TextureInfo.TextureID);
                    }
                    ManagedImage mi;
                    if (!OpenJPEG.DecodeToImage(item.TextureData, out mi)) continue;

                    bool hasAlpha = false;
                    bool fullAlpha = false;
                    bool isMask = false;
                    if ((mi.Channels & ManagedImage.ImageChannels.Alpha) != 0)
                    {
                        fullAlpha = true;
                        isMask = true;

                        // Do we really have alpha, is it all full alpha, or is it a mask
                        for (int i = 0; i < mi.Alpha.Length; i++)
                        {
                            if (mi.Alpha[i] < 255)
                            {
                                hasAlpha = true;
                            }
                            if (mi.Alpha[i] != 0)
                            {
                                fullAlpha = false;
                            }
                            if (mi.Alpha[i] != 0 && mi.Alpha[i] != 255)
                            {
                                isMask = false;
                            }
                        }

                        if (!hasAlpha)
                        {
                            mi.ConvertChannels(mi.Channels & ~ManagedImage.ImageChannels.Alpha);
                        }
                    }

                    item.Data.TextureInfo.HasAlpha = hasAlpha;
                    item.Data.TextureInfo.FullAlpha = fullAlpha;
                    item.Data.TextureInfo.IsMask = isMask;

                    imageBytes = mi.ExportTGA();
                    if (CacheDecodedTextures)
                    {
                        RHelp.SaveCachedImage(imageBytes, item.TeFace.TextureID, hasAlpha, fullAlpha, isMask);
                    }
                }

                if (imageBytes != null)
                {
                    Image img;

                    using (MemoryStream byteData = new MemoryStream(imageBytes))
                    {
                        img = OpenMetaverse.Imaging.LoadTGAClass.LoadTGA(byteData);
                    }

                    Bitmap bitmap = (Bitmap)img;

                    bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    item.Data.TextureInfo.TexturePointer = RHelp.GLLoadImage(bitmap, item.Data.TextureInfo.HasAlpha);
                    GL.Flush();
                    bitmap.Dispose();
                }

                item.TextureData = null;
                item.TGAData = null;
                imageBytes = null;
            }
            context.MakeCurrent(window.WindowInfo);
            context.Dispose();
            window.Dispose();
            TextureThreadContextReady.Set();
            Logger.DebugLog("Texture thread exited");
        }
コード例 #17
0
ファイル: PrimWorkshop.cs プロジェクト: Xara/Radegast-Viewer
        void TextureThread()
        {
            OpenTK.INativeWindow window = new OpenTK.NativeWindow();
            OpenTK.Graphics.IGraphicsContext context = new OpenTK.Graphics.GraphicsContext(GLMode, window.WindowInfo);
            context.MakeCurrent(window.WindowInfo);
            TextureThreadContextReady.Set();
            PendingTextures.Open();
            Logger.DebugLog("Started Texture Thread");

            while (window.Exists && TextureThreadRunning)
            {
                window.ProcessEvents();

                TextureLoadItem item = null;

                if (!PendingTextures.Dequeue(Timeout.Infinite, ref item)) continue;

                if (LoadTexture(item.TeFace.TextureID, ref item.Data.Texture, false))
                {
                    GL.GenTextures(1, out item.Data.TexturePointer);
                    GL.BindTexture(TextureTarget.Texture2D, item.Data.TexturePointer);

                    Bitmap bitmap = new Bitmap(item.Data.Texture);

                    bool hasAlpha;
                    if (item.Data.Texture.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb)
                    {
                        hasAlpha = true;
                    }
                    else
                    {
                        hasAlpha = false;
                    }
                    item.Data.IsAlpha = hasAlpha;

                    bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
                    Rectangle rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);


                    BitmapData bitmapData =
                        bitmap.LockBits(
                        rectangle,
                        ImageLockMode.ReadOnly,
                        hasAlpha ? System.Drawing.Imaging.PixelFormat.Format32bppArgb : System.Drawing.Imaging.PixelFormat.Format24bppRgb);

                    GL.TexImage2D(
                        TextureTarget.Texture2D,
                        0,
                        hasAlpha ? PixelInternalFormat.Rgba : PixelInternalFormat.Rgb8,
                        bitmap.Width,
                        bitmap.Height,
                        0,
                        hasAlpha ? OpenTK.Graphics.OpenGL.PixelFormat.Bgra : OpenTK.Graphics.OpenGL.PixelFormat.Bgr,
                        PixelType.UnsignedByte,
                        bitmapData.Scan0);

                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
                    if (hasMipmap)
                    {
                        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear);
                        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.GenerateMipmap, 1);
                        GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
                    }
                    else
                    {
                        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
                    }

                    bitmap.UnlockBits(bitmapData);
                    bitmap.Dispose();

                    GL.Flush();
                    SafeInvalidate();
                }
            }
            Logger.DebugLog("Texture thread exited");
        }
コード例 #18
0
ファイル: Q3Bsp.cs プロジェクト: geralltf/alethaCS
        private static void processSurfacesThread()
        {
            shader_p surface;
            bool     processSurfaces;

            // Any method called within this thread that accesses GL must update the context like this before GL calls can be made:
            var context = new OpenTK.Graphics.GraphicsContext(AlethaApplication.GraphicsMode, AlethaApplication.NativeWindowContext.WindowInfo);

            context.MakeCurrent(AlethaApplication.NativeWindowContext.WindowInfo);

            processSurfaces = true;

            // PROCESS SURFACE SHADERS
            // as they come in until there are none left

            while (processSurfaces)
            {
                // Sort any surfaces found in unshadedSurfaces in correct model, effect, or default bins as discovered

                if (unshadedSurfaces.Count == 0)
                {
                    // Have we processed all surfaces?
                    // Sort to ensure correct order of transparent objects

                    effectSurfaces.Sort((shader_p a, shader_p b) =>
                    {
                        int order = a.shader.sort - b.shader.sort;
                        // TODO: Sort by state here to cut down on changes?
                        return(order); //(order == 0 ? 1 : order);
                    });

                    processSurfaces = false;
                }

                {
                    String    shader_name;
                    shader_gl shader;


                    if (unshadedSurfaces.Count != 0)
                    {
                        surface = unshadedSurfaces.Last();
                        unshadedSurfaces.RemoveAt(unshadedSurfaces.Count - 1);

                        //shader_p surface = unshadedSurfaces.RemoveAt(0); // var surface = unshadedSurfaces.shift();

                        shader_name = surface.shaderName;
                        //shader_name = shader_name.startsWith('"')?shader_name.substring(1):shader_name; // BUG

                        if (q3bsp.shaders.ContainsKey(shader_name))
                        {
                            shader = q3bsp.shaders[shader_name];
                        }
                        else
                        {
                            shader = null;
                        }

                        //shader_gl skyshader = q3bsp.shaders['textures/atcs/skybox_s'];

                        if (shader == null)
                        {
                            surface.shader = glshading.buildDefault(surface);

                            if (surface.geomType == 3)
                            {
                                surface.shader.model = true;
                                modelSurfaces.Add(surface);
                            }
                            else
                            {
                                defaultSurfaces.Add(surface);
                            }
                        }
                        else
                        {
                            glshading.loadShaderMaps(surface, shader);

                            surface.shader = shader;

                            if (shader.sky == true)
                            {
                                skybox.skyShader = shader; // Sky does not get pushed into effectSurfaces. It's a separate pass
                            }
                            else
                            {
                                effectSurfaces.Add(surface);
                            }
                        }
                    }
                }
            }

            Console.WriteLine("Processed surfaces");
        }
コード例 #19
0
ファイル: Program.cs プロジェクト: cartman300/Tetraquark
        static void Main()
        {
            Console.Title = "Tetraquark Console";
            Running = true;

            const string ConfigFile = "cfg.yaml";
            if (File.Exists(ConfigFile)) {
                Console.WriteLine("Loading config file {0}", ConfigFile);
                Settings.Load(File.ReadAllText(ConfigFile));
            }

            GameWatch = new Stopwatch();
            GameWatch.Start();
            PackMgr.Mount("Default.zip");

            string[] Files = PackMgr.GetFiles();
            for (int i = 0; i < Files.Length; i++) {
                if (Files[i].StartsWith("resources/fonts/"))
                    ResourceMgr.Register<Font>(PackMgr.OpenFile(Files[i]), Path.GetFileNameWithoutExtension(Files[i]));
                else if (Files[i].StartsWith("resources/textures/"))
                    ResourceMgr.Register<Texture>(PackMgr.OpenFile(Files[i]), Path.GetFileNameWithoutExtension(Files[i]));
            }

            Scales.Init(new Vector2f(ResX, ResY));

            // OpenTK
            ToolkitOptions TOpt = ToolkitOptions.Default;
            TOpt.Backend = PlatformBackend.PreferNative;
            TOpt.EnableHighResolution = true;
            Toolkit.Init(TOpt);
            // SFML
            VideoMode VMode = new VideoMode((uint)Scales.XRes, (uint)Scales.YRes, (uint)BitsPerPixel);
            ContextSettings CSet = new ContextSettings((uint)DepthBits, (uint)StencilBits);
            CSet.MajorVersion = 4;
            CSet.MinorVersion = 2;
            CSet.AntialiasingLevel = (uint)Samples;
            Styles S = Styles.None;
            if (Border)
                S |= Styles.Titlebar | Styles.Close;
            RenderWindow RWind = new RenderWindow(VMode, "Tetraquark", S, CSet);
            RWind.Closed += (Snd, E) => Running = false;
            RWind.SetKeyRepeatEnabled(false);
            // OpenTK
            IWindowInfo WindInfo = Utilities.CreateWindowsWindowInfo(RWind.SystemHandle);
            var GfxMode = new GraphicsMode(new ColorFormat(BitsPerPixel), DepthBits, StencilBits, Samples, new ColorFormat(0));
            var GfxCtx = new GraphicsContext(GfxMode, WindInfo, (int)CSet.MajorVersion, (int)CSet.MinorVersion,
                GfxCtxFlags.Default);
            GfxCtx.MakeCurrent(WindInfo);
            GfxCtx.LoadAll();
            RWind.ResetGLStates();

            //GL.Enable(EnableCap.FramebufferSrgb);

            Renderer.Init(RWind);
            Stopwatch Clock = new Stopwatch();
            Clock.Start();

            while (Running) {
                RWind.DispatchEvents();
                while (Clock.ElapsedMilliseconds < 10)
                    ;
                float Dt = (float)Clock.ElapsedMilliseconds / 1000;
                Clock.Restart();
                Renderer.Update(Dt);
                Renderer.Draw(RWind);
                RWind.Display();
            }

            RWind.Close();
            RWind.Dispose();
            Console.WriteLine("Flushing configs");
            File.WriteAllText(ConfigFile, Settings.Save());
            Environment.Exit(0);
        }