# Objects::Components::Texture2D

### Textures in Unified Engine

The `Unified Engine` offers efficient handling of textures, combining multiple images into one to reduce the number of draw calls in a graphics engine. This is achieved through the use of a texture atlas. The engine also provides individual 2D texture handling, allowing users to manage and utilize individual images.

#### Texture UVs and Identifiers

Utility structures that help in defining and tracking textures within the atlas.

```cpp
struct TextureUVs{
    glm::vec2 UV[4];
};

struct Atlas_Space_Identifier
{
    uint32_t x;
    uint32_t y;
    uint32_t w;
    uint32_t h;
};

struct Atlas_Texture_Identifier
{
    uint32_t x;
    uint32_t y;
    uint32_t w;
    uint32_t h;
    Texture2D* Texture;
};

struct Atlas_Image_Location
{
    glm::ivec2 pos;
    GLuint Dest;
    int index;
};
```

#### Texture Atlas

A `TextureAtlas` class represents a collection of textures, minimizing the need for multiple texture binds when rendering.&#x20;

```cpp
class TextureAtlas{
    friend Texture2D;
    ...
    TextureAtlas();
    ~TextureAtlas();

    int AddImage(Texture2D* image);
    int RemoveImage(Texture2D* image);
    int Toggle(Texture2D* image);
};
extern TextureAtlas* __GLOBAL_ATLAS;
```

#### Texture2D

The `Texture2D` class provides functionality to manage individual 2D textures. These textures can be loaded from file paths or directly from data.&#x20;

```cpp
class Texture2D{
    friend TextureAtlas;
    ...
    Texture2D(std::string FilePath);
    Texture2D(uint8_t* Data, int width, int height);
    ~Texture2D();

    int UpdateTeture(std::string FilePath);
    int Bind();
    int Unbind();
    void operator=(TextureAtlas* Atlas);
};
```
