TerraForge3D  2.3.1
3D Terrain And Landscape Generator
ShaderTextureManager.cpp
1#include "Shading/ShaderTextureManager.h"
2#include "Shading/ShaderNodes/ShaderTextureNode.h"
3
4#include "glad/glad.h"
5
6
7ShaderTextureManager::ShaderTextureManager()
8{
9 textureArray = 0;
10 glGenTextures(1, &textureArray);
11 glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray);
12 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
13 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
14 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
15 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
16 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_REPEAT);
17 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
18 glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
19}
20
21ShaderTextureManager::~ShaderTextureManager()
22{
23}
24
25void ShaderTextureManager::Register(ShaderTextureNode *node)
26{
27 textureNodes.push_back(node);
28 node->zCoord = textureNodes.size() - 1;
29}
30
31void ShaderTextureManager::Unregister(ShaderTextureNode *node)
32{
33 for(int i = 0; i < textureNodes.size(); i++)
34 {
35 if(textureNodes[i]->id == node->id)
36 {
37 textureNodes.erase(textureNodes.begin() + i);
38 break;
39 }
40 }
41
42 for(int i = 0; i < textureNodes.size(); i++)
43 {
44 textureNodes[i]->zCoord = i;
45 }
46}
47
48void ShaderTextureManager::UpdateShaders()
49{
50 glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray);
51 glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB8, resolution, resolution, textureNodes.size(), 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
52
53 for(int i = 0; i < textureNodes.size(); i++)
54 {
55 textureNodes[i]->texture->Resize(resolution, resolution);
56 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, resolution, resolution, 1, GL_RGB, GL_UNSIGNED_BYTE, textureNodes[i]->texture->GetData());
57 }
58
59 glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
60}
61
62void ShaderTextureManager::UploadToGPU(int id)
63{
64 glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray);
65 textureNodes[id]->texture->Resize(resolution, resolution);
66 glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, id, resolution, resolution, 1, GL_RGB, GL_UNSIGNED_BYTE, textureNodes[id]->texture->GetData());
67 glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
68}
69
70void ShaderTextureManager::Bind(uint32_t slot)
71{
72 glActiveTexture(GL_TEXTURE0 + slot);
73 glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray);
74}