> For the complete documentation index, see [llms.txt](https://ferra13671-dev.gitbook.io/projects/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ferra13671-dev.gitbook.io/projects/main/gltextureutils-documentation/glcontroller.md).

# GLController

Have you ever needed to change a method call in a utility?\
**GLController** allows you to override the basic OpenGL methods within **GLTextureUtils**.&#x20;This feature will be useful when you have an alternative implementation of the method, or you want to embed your code in the method or log it.

GLController allows you to override methods such as:

* `GL11.glGenTextures`   (genTexId)
* `GL11.glDeleteTextures`   (deleteTexture)
* `GL11.glTexParameteri`   (texParameter)
* `GL11.glTexParameterf`   (texParameter)
* `GL11.glTexImage2D`   (texImage2D)
* `GL11.glTexSubImage2D`   (texSubImage2D)
* `GL11.glCopyTexSubImage2D` (copyTexSubImage2D)
* `GL11.glGetTexImage` (getTexImage)
* `GL11.glPixelStorei`   (pixelStore)

By default, **GLTextureUtils** has a **DefaultGLController**:

```java
public class DefaultGLController implements GLController {

    @Override
    public void run(Runnable runnable) {
        runnable.run();
    }

    @Override
    public int genTexId() {
        return GL11.glGenTextures();
    }

    @Override
    public void deleteTexture(int id) {
        GL11.glDeleteTextures(id);
    }

    @Override
    public void bindTexture(int id) {
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
    }

    @Override
    public void texParameter(int target, int pname, int param) {
        GL11.glTexParameteri(target, pname, param);
    }

    @Override
    public void texParameter(int target, int pname, float param) {
        GL11.glTexParameterf(target, pname, param);
    }

    @Override
    public void texImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
        GL11.glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
    }

    @Override
    public void texSubImage2D(int target, int level, int xOffset, int yOffset, int width, int height, int format, int type, long pixels) {
        GL11.glTexSubImage2D(target, level, xOffset, yOffset, width, height, format, type, pixels);
    }

    @Override
    public void copyTexSubImage2D(int target, int level, int xOffset, int yOffset, int x, int y, int width, int height) {
        GL11.glCopyTexSubImage2D(target, level, xOffset, yOffset, x, y, width, height);
    }

    @Override
    public void getTexImage(int tex, int level, int externalFormat, int type, ByteBuffer pixels) {
        GL11.glGetTexImage(tex, level, externalFormat, type, pixels);
    }

    @Override
    public void pixelStore(int pname, int param) {
        GL11.glPixelStorei(pname, param);
    }
}
```

To change the controller, you need to call&#x20;the method `GLTextureSystem.setGlController(GLController controller)`. Let's write an example of changing the controller to ours, which will log each method call:

```java
GLTextureSystem.setGlController(new GLController() {
            @Override
            public void run(Runnable runnable) {
                runnable.run();
            }

            @Override
            public int genTexId() {
                System.out.println("Call glGenTextures.");
                return GL11.glGenTextures();
            }

            @Override
            public void deleteTexture(int id) {
                System.out.println("Call glDeleteTextures.");
                GL11.glDeleteTextures(id);
            }

            @Override
            public void bindTexture(int id) {
                System.out.println("Call glBindTexture.");
                GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
            }

            @Override
            public void texParameter(int target, int pname, int param) {
                System.out.println("Call glTexParameteri.");
                GL11.glTexParameteri(target, pname, param);
            }

            @Override
            public void texParameter(int target, int pname, float param) {
                System.out.println("Call glTexParameterf.");
                GL11.glTexParameterf(target, pname, param);
            }

            @Override
            public void texImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
                System.out.println("Call glTexImage2D.");
                GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
            }

            @Override
            public void texSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels) {
                System.out.println("Call glTexSubImage2D.");
                GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
            }
            
            @Override
            public void copyTexSubImage2D(int target, int level, int xOffset, int yOffset, int x, int y, int width, int height) {
                System.out.println("Call glcopyTexSubImage2D.");
                GL11.glCopyTexSubImage2D(target, level, xOffset, yOffset, x, y, width, height);
            }

            @Override
            public void getTexImage(int tex, int level, int externalFormat, int type, ByteBuffer pixels) {
                System.out.println("Call glGetTexImage");
                GL11.glGetTexImage(tex, level, externalFormat, type, pixels);
            }

            @Override
            public void pixelStore(int pname, int param) {
                System.out.println("Call glPixelStorei.");
                GL11.glPixelStorei(pname, param);
            }
        });
```
