TDME2  1.9.200
LightingShaderTerrainImplementation.cpp
Go to the documentation of this file.
2 
3 #include <string>
4 
5 #include <tdme/tdme.h>
11 #include <tdme/engine/Engine.h>
12 #include <tdme/engine/Texture.h>
15 
16 using std::string;
17 using std::to_string;
18 
29 
30 bool LightingShaderTerrainImplementation::isSupported(Renderer* renderer) {
31  return true;
32 }
33 
35 {
36 }
37 
39  return "terrain";
40 }
41 
43 {
44  auto shaderVersion = renderer->getShaderVersion();
45 
46  // lighting
47  // vertex shader
50  "shader/" + shaderVersion + "/lighting/specular",
51  "render_vertexshader.vert",
52  "#define LIGHT_COUNT " + to_string(Engine::LIGHTS_MAX) + "\n#define HAVE_TERRAIN_SHADER\n#define HAVE_DEPTH_FOG\n" + additionalDefinitions
53  );
54  if (vertexShaderId == 0) return;
55 
56  // fragment shader
59  "shader/" + shaderVersion + "/lighting/specular",
60  "render_fragmentshader.frag",
61  "#define LIGHT_COUNT " + to_string(Engine::LIGHTS_MAX) + "\n#define HAVE_TERRAIN_SHADER\n#define HAVE_DEPTH_FOG\n" + additionalDefinitions,
62  FileSystem::getInstance()->getContentAsString(
63  "shader/" + shaderVersion + "/functions/specular",
64  "specular_lighting.inc.glsl"
65  ) + "\n" +
66  FileSystem::getInstance()->getContentAsString(
67  "shader/" + shaderVersion + "/functions",
68  "terrain.inc.glsl"
69  ) + "\n"
70  );
71  if (fragmentShaderId == 0) return;
72 
73  // create, attach and link program
77 
78  //
80  if (initialized == false) return;
81 
82  //
83  initialized = false;
84 
86 
88  if (uniformGrasTextureUnit == -1) return;
89 
91  if (uniformDirtTextureUnit == -1) return;
92 
94  if (uniformSnowTextureUnit == -1) return;
95 
97  if (uniformStoneTextureUnit == -1) return;
98 
99  //
100  loadTextures(".");
101 
102  //
103  initialized = true;
104 }
105 
107  // register shader
109  Engine::ShaderType::SHADERTYPE_OBJECT,
110  getId()
111  );
112 }
113 
116 
117  //
118  auto currentTextureUnit = renderer->getTextureUnit(contextIdx);
120  renderer->bindTexture(contextIdx, grasTextureId);
122  renderer->bindTexture(contextIdx, dirtTextureId);
124  renderer->bindTexture(contextIdx, snowTextureId);
126  renderer->bindTexture(contextIdx, stoneTextureId);
128  renderer->setTextureUnit(contextIdx, currentTextureUnit);
129 
130  //
135 }
136 
138  //
139  auto currentTextureUnit = renderer->getTextureUnit(contextIdx);
141  renderer->bindTexture(contextIdx, renderer->ID_NONE);
143  renderer->bindTexture(contextIdx, renderer->ID_NONE);
145  renderer->bindTexture(contextIdx, renderer->ID_NONE);
147  renderer->bindTexture(contextIdx, renderer->ID_NONE);
148  renderer->setTextureUnit(contextIdx, currentTextureUnit);
149 
150  //
152 }
153 
157 }
158 
160 }
161 
163  if (grasTexture != nullptr) {
166  grasTexture = nullptr;
168  }
169  if (dirtTexture != nullptr) {
172  dirtTexture = nullptr;
174  }
175  if (snowTexture != nullptr) {
178  snowTexture = nullptr;
180  }
181  if (stoneTexture != nullptr) {
184  stoneTexture = nullptr;
186  }
187 }
188 
190  //
191  grasTextureId = Engine::getInstance()->getTextureManager()->addTexture(grasTexture = TextureReader::read(pathName + "/resources/engine/textures", "terrain_gras.png"), renderer->CONTEXTINDEX_DEFAULT);
192  dirtTextureId = Engine::getInstance()->getTextureManager()->addTexture(dirtTexture = TextureReader::read(pathName + "/resources/engine/textures", "terrain_dirt.png"), renderer->CONTEXTINDEX_DEFAULT);
193  snowTextureId = Engine::getInstance()->getTextureManager()->addTexture(snowTexture = TextureReader::read(pathName + "/resources/engine/textures", "terrain_snow.png"), renderer->CONTEXTINDEX_DEFAULT);
194  stoneTextureId = Engine::getInstance()->getTextureManager()->addTexture(stoneTexture = TextureReader::read(pathName + "/resources/engine/textures", "terrain_stone.png"), renderer->CONTEXTINDEX_DEFAULT);
195 }
Engine main class.
Definition: Engine.h:131
static Engine * getInstance()
Returns engine instance.
Definition: Engine.h:612
static TextureManager * getTextureManager()
Definition: Engine.h:627
static void registerShader(ShaderType type, const string &shaderId, const vector< Shader::ParameterDefaults > &parameterDefaults={}, bool internal=false)
Register shader.
Definition: Engine.h:856
Texture entity.
Definition: Texture.h:24
const string & getId() const
Definition: Texture.h:172
virtual void updateMatrices(Renderer *renderer, int contextIdx) override
Update matrices to program.
virtual void unUseProgram(int contextIdx) override
Unuse lighting program.
virtual void useProgram(Engine *engine, int contextIdx) override
Use lighting program.
virtual void updateMatrices(Renderer *renderer, int contextIdx) override
Update matrices to program.
virtual void useProgram(Engine *engine, int contextIdx) override
Use lighting program.
virtual void updateShaderParameters(Renderer *renderer, int contextIdx) override
Update shader parameters.
void removeTexture(Texture *texture)
Removes a texture from manager.
TextureManager_TextureManaged * addTexture(const string &id, bool &created)
Adds a texture to manager.
virtual void setTextureUnit(int contextIdx, int32_t textureUnit)=0
Sets up texture unit.
virtual int32_t loadShader(int32_t type, const string &pathName, const string &fileName, const string &definitions=string(), const string &functions=string())=0
Loads a shader.
virtual int32_t createProgram(int type)=0
Creates a shader program.
virtual int32_t getTextureUnit(int contextIdx)=0
Get texture unit.
virtual void setProgramUniformInteger(int contextIdx, int32_t uniformId, int32_t value)=0
Set up a integer uniform value.
virtual void bindTexture(int contextIdx, int32_t textureId)=0
Binds a texture with given id or unbinds when using ID_NONE.
virtual void attachShaderToProgram(int32_t programId, int32_t shaderId)=0
Attaches a shader to a program.
virtual void setProgramUniformFloatMatrix4x4(int contextIdx, int32_t uniformId, const array< float, 16 > &value)=0
Set up a float matrix 4x4 uniform value.
virtual int32_t getProgramUniformLocation(int32_t programId, const string &name)=0
Returns location of given uniform variable.
const array< float, 16 > & getArray() const
Definition: Matrix4x4.h:611
File system singleton class.
Definition: FileSystem.h:17
virtual void releaseReference()
Releases a reference, thus decrementing the counter and delete it if reference counter is zero.
Definition: Reference.h:38