TDME2  1.9.200
PostProcessingShaderLightScatteringImplementation.cpp
Go to the documentation of this file.
1 #include <string>
2 
3 #include <tdme/tdme.h>
7 #include <tdme/engine/Engine.h>
9 #include <tdme/math/Math.h>
10 
11 using std::string;
12 
17 using tdme::math::Math;
18 
19 bool PostProcessingShaderLightScatteringImplementation::isSupported(Renderer* renderer) {
20  return renderer->getShaderVersion() == "gl3";
21 }
22 
24 {
25 }
26 
28 {
29  auto shaderVersion = renderer->getShaderVersion();
30 
31  // fragment shader
34  "shader/" + shaderVersion + "/postprocessing",
35  "light_scattering_fragmentshader.frag",
36  "#define LIGHT_COUNT " + to_string(Engine::LIGHTS_MAX) + "\n"
37  );
38  if (fragmentShaderId == 0) return;
39 
40  // vertex shader
43  "shader/" + shaderVersion + "/postprocessing",
44  "light_scattering_vertexshader.vert",
45  "#define LIGHT_COUNT " + to_string(Engine::LIGHTS_MAX) + "\n"
46  );
47  if (vertexShaderId == 0) return;
48 
49  // create, attach and link program
53 
54  //
56 
57  // lights
58  for (auto i = 0; i < Engine::LIGHTS_MAX; i++) {
59  uniformLightEnabled[i] = renderer->getProgramUniformLocation(programId, "lights[" + to_string(i) +"].enabled");
60  uniformLightPosition[i] = renderer->getProgramUniformLocation(programId, "lights[" + to_string(i) +"].position");
61  uniformLightIntensity[i] = renderer->getProgramUniformLocation(programId, "lights[" + to_string(i) +"].intensity");
62  }
63 
64  // register shader
65  if (initialized == false) return;
66 
67  //
69  Engine::ShaderType::SHADERTYPE_POSTPROCESSING,
70  "light_scattering"
71  );
72 }
73 
75  int _width = engine->getScaledWidth() != -1?engine->getScaledWidth():engine->getWidth();
76  int _height = engine->getScaledHeight() != -1?engine->getScaledHeight():engine->getHeight();
77  for (auto i = 0; i < engine->getLightCount(); i++) {
78  auto light = engine->getLightAt(i);
79  //
80  if (light->isEnabled() == false ||
81  (light->isRenderSource() == false && (engine->isSkyShaderEnabled() == false || (i != Engine::LIGHTIDX_SUN && i != Engine::LIGHTIDX_MOON)))) {
83  continue;
84  }
85  //
86  Vector2 lightSourcePosition2D;
87  Vector3 lightSourcePosition = Vector3(light->getPosition().getX(), light->getPosition().getY(), light->getPosition().getZ());
88  if (light->getPosition().getW() > Math::EPSILON) lightSourcePosition.scale(1.0f / light->getPosition().getW());
89  auto lightDistance = lightSourcePosition.computeLength();
90  if (lightDistance < 1000000.0f) lightSourcePosition.scale(1000000.0f / lightDistance);
91  engine->computeScreenCoordinateByWorldCoordinate(lightSourcePosition, lightSourcePosition2D);
92  lightSourcePosition2D.setX(Math::clamp(lightSourcePosition2D.getX() / static_cast<float>(_width), 0.0f, 1.0f));
93  lightSourcePosition2D.setY(Math::clamp(1.0f - (lightSourcePosition2D.getY() / static_cast<float>(_height)), 0.0f, 1.0f));
94  float intensity = 1.0f;
95  float _intensity = 1.0f;
96  if (lightSourcePosition2D.getX() < 0.4f) _intensity = lightSourcePosition2D.getX() / 0.4f;
97  if (_intensity < intensity) intensity = _intensity;
98  if (lightSourcePosition2D.getX() > 0.6f) _intensity = (1.0f - lightSourcePosition2D.getX()) / 0.4f;
99  if (_intensity < intensity) intensity = _intensity;
100  if (lightSourcePosition2D.getY() < 0.4f) _intensity = lightSourcePosition2D.getY() / 0.4f;
101  if (_intensity < intensity) intensity = _intensity;
102  if (lightSourcePosition2D.getY() > 0.6f) _intensity = (1.0f - lightSourcePosition2D.getY()) / 0.4f;
103  if (_intensity < intensity) intensity = _intensity;
104  if (intensity < Math::EPSILON) {
106  } else {
107  if (renderer->getRendererType() == Renderer::RENDERERTYPE_VULKAN) {
108  lightSourcePosition2D = Vector2(lightSourcePosition2D.getX(), 1.0f - lightSourcePosition2D.getY());
109  }
111  renderer->setProgramUniformFloatVec2(contextIdx, uniformLightPosition[i], lightSourcePosition2D.getArray());
112  renderer->setProgramUniformFloat(contextIdx, uniformLightIntensity[i], intensity * 0.6f);
113  }
114  }
115 }
Engine main class.
Definition: Engine.h:131
Light * getLightAt(int32_t idx)
Returns light at idx (0 <= idx < 8)
Definition: Engine.h:1143
int32_t getLightCount()
Definition: Engine.h:1134
int32_t getWidth()
Definition: Engine.h:1029
int32_t getHeight()
Definition: Engine.h:1036
bool isSkyShaderEnabled()
Definition: Engine.h:1112
bool computeScreenCoordinateByWorldCoordinate(const Vector3 &worldCoordinate, Vector2 &screenCoordinate, int width=-1, int height=-1)
Convert screen coordinate by world coordinate.
Definition: Engine.cpp:2058
static void registerShader(ShaderType type, const string &shaderId, const vector< Shader::ParameterDefaults > &parameterDefaults={}, bool internal=false)
Register shader.
Definition: Engine.h:856
int32_t getScaledWidth()
Definition: Engine.h:1043
int32_t getScaledHeight()
Definition: Engine.h:1050
Shader parameter model class.
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 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
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Definition: Vector2.h:20
float getY() const
Definition: Vector2.h:111
float getX() const
Definition: Vector2.h:94
Vector2 & setX(float x)
Sets x component.
Definition: Vector2.h:103
const array< float, 2 > & getArray() const
Definition: Vector2.h:257
Vector2 & setY(float y)
Sets y component.
Definition: Vector2.h:120
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
float computeLength() const
Definition: Vector3.h:274
Vector3 & scale(float scalar)
Scales by scalar.
Definition: Vector3.h:201