TDME2  1.9.200
LightingShaderWaterImplementation.cpp
Go to the documentation of this file.
1 // @see https://jayconrod.com/posts/34/water-simulation-in-glsl
2 
4 
5 #include <array>
6 #include <string>
7 
8 #include <tdme/tdme.h>
10 #include <tdme/engine/Engine.h>
12 #include <tdme/engine/Timing.h>
13 #include <tdme/math/Math.h>
16 
17 using std::array;
18 using std::string;
19 using std::to_string;
20 
27 using tdme::math::Math;
30 
31 bool LightingShaderWaterImplementation::isSupported(Renderer* renderer) {
32  return true;
33 }
34 
36 {
37 }
38 
40  return "water";
41 }
42 
44 {
45  auto shaderVersion = renderer->getShaderVersion();
46 
47  // lighting
48  // vertex shader
51  "shader/" + shaderVersion + "/lighting/specular",
52  "render_vertexshader.vert",
53  "#define LIGHT_COUNT " + to_string(Engine::LIGHTS_MAX) + "\n#define HAVE_WATER_SHADER\n#define HAVE_DEPTH_FOG",
54  FileSystem::getInstance()->getContentAsString(
55  "shader/" + shaderVersion + "/functions",
56  "water.inc.glsl"
57  )
58  );
59  if (vertexShaderId == 0) return;
60 
61  // fragment shader
64  "shader/" + shaderVersion + "/lighting/specular",
65  "render_fragmentshader.frag",
66  "#define LIGHT_COUNT " + to_string(Engine::LIGHTS_MAX) + "\n#define HAVE_WATER_SHADER\n#define HAVE_DEPTH_FOG",
67  FileSystem::getInstance()->getContentAsString(
68  "shader/" + shaderVersion + "/functions/specular",
69  "specular_lighting.inc.glsl"
70  )
71  );
72  if (fragmentShaderId == 0) return;
73 
74  // create, attach and link program
78 
79  //
81 
82  //
83  initialized = false;
84 
85  //
87  if (uniformWaterHeight == -1) return;
89  if (uniformTime == -1) return;
91  if (uniformWaterWaves == -1) return;
92  for (auto i = 0; i < WAVES_MAX; i++) {
93  uniformWaterAmplitude[i] = renderer->getProgramUniformLocation(programId, "waterAmplitude[" + to_string(i) + "]");
94  if (uniformWaterAmplitude[i] == -1) return;
95  }
96  for (auto i = 0; i < WAVES_MAX; i++) {
97  uniformWaterWaveLength[i] = renderer->getProgramUniformLocation(programId, "waterWavelength[" + to_string(i) + "]");
98  if (uniformWaterWaveLength[i] == -1) return;
99  }
100  for (auto i = 0; i < WAVES_MAX; i++) {
101  uniformWaterSpeed[i] = renderer->getProgramUniformLocation(programId, "waterSpeed[" + to_string(i) + "]");
102  if (uniformWaterSpeed[i] == -1) return;
103  }
104  for (auto i = 0; i < WAVES_MAX; i++) {
105  uniformWaterDirection[i] = renderer->getProgramUniformLocation(programId, "waterDirection[" + to_string(i) + "]");
106  if (uniformWaterDirection[i] == -1) return;
107  }
109 
110  //
111  initialized = true;
112 
113  //
114  for (auto i = 0; i < 4; i++) angle[i] = -Math::PI / 3.0f + Math::random() * Math::PI * 2.0f / 3.0f;
115 }
116 
119  Engine::ShaderType::SHADERTYPE_OBJECT,
120  getId(),
121  {
122  { "speed", ShaderParameter(1.0f), ShaderParameter(0.0f), ShaderParameter(20.0f), ShaderParameter(1.0f) },
123  }
124  );
125 }
126 
129 
130  //
134  for (auto i = 0; i < 4; i++) {
135  renderer->setProgramUniformFloat(contextIdx, uniformWaterAmplitude[i], 0.5f / (i + 1));
136  renderer->setProgramUniformFloat(contextIdx, uniformWaterWaveLength[i], 8 * Math::PI / (i + 1));
137  renderer->setProgramUniformFloat(contextIdx, uniformWaterSpeed[i], 1.0f + 1.0f * i / 2.0f);
138  renderer->setProgramUniformFloatVec2(contextIdx, uniformWaterDirection[i], {Math::cos(angle[i]), Math::sin(angle[i])});
139  }
140  time+= engine->getTiming()->getDeltaTime() / 1000.0f;
141 }
142 
146 }
147 
149 }
Engine main class.
Definition: Engine.h:131
static void registerShader(ShaderType type, const string &shaderId, const vector< Shader::ParameterDefaults > &parameterDefaults={}, bool internal=false)
Register shader.
Definition: Engine.h:856
Timing * getTiming()
Definition: Engine.h:1064
Shader parameter model class.
Timing class.
Definition: Timing.h:16
int64_t getDeltaTime()
Gets the time passed between last and current frame.
Definition: Timing.h:85
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 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.
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 void setProgramUniformFloatVec2(int contextIdx, int32_t uniformId, const array< float, 2 > &data)=0
Set up a float vec2 uniform value.
virtual void setProgramUniformInteger(int contextIdx, int32_t uniformId, int32_t value)=0
Set up a integer uniform value.
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.
virtual void setProgramUniformFloat(int contextIdx, int32_t uniformId, float value)=0
Set up a float uniform value.
Standard math functions.
Definition: Math.h:19
const array< float, 16 > & getArray() const
Definition: Matrix4x4.h:611
File system singleton class.
Definition: FileSystem.h:17