TDME2  1.9.200
ParticlesShader.cpp
Go to the documentation of this file.
2 
3 #include <tdme/tdme.h>
4 #include <tdme/engine/Texture.h>
6 #include <tdme/engine/Engine.h>
7 #include <tdme/math/Matrix4x4.h>
9 
16 
17 ParticlesShader::ParticlesShader(Engine* engine, Renderer* renderer)
18 {
19  this->engine = engine;
20  this->renderer = renderer;
21  isRunning = false;
22  initialized = false;
23 }
24 
26 {
27  return initialized;
28 }
29 
31 {
32  auto shaderVersion = renderer->getShaderVersion();
33  // particles
34  // vertex shader
37  "shader/" + shaderVersion + "/particles",
38  "render_vertexshader.vert",
39  string() +
40  "#define HAVE_DEPTH_FOG\n" +
41  "#define ATLASTEXTURE_COUNT " + to_string(ATLASTEXTURE_COUNT) + "\n"
42  );
43  if (vertexShaderId == 0) return;
44  // fragment shader
47  "shader/" + shaderVersion + "/particles",
48  "render_fragmentshader.frag",
49  string() +
50  "#define HAVE_DEPTH_FOG\n" +
51  "#define ATLASTEXTURE_COUNT " + to_string(ATLASTEXTURE_COUNT) + "\n"
52  );
53  if (fragmentShaderId == 0) return;
54  // create, attach and link program
58  // map inputs to attributes
61  renderer->setProgramAttributeLocation(programId, 1, "inTextureSpriteIndex");
64  renderer->setProgramAttributeLocation(programId, 6, "inSpriteSheetDimensions");
65  renderer->setProgramAttributeLocation(programId, 10, "inEffectColorMul");
66  renderer->setProgramAttributeLocation(programId, 11, "inEffectColorAdd");
67  }
68  // link program
69  if (renderer->linkProgram(programId) == false) return;
70 
71  // get uniforms
73  if (uniformMVPMatrix == -1) return;
74 
75  // TODO: use ivec2 and vec2
77  if (uniformViewPortWidth == -1) return;
79  if (uniformViewPortHeight == -1) return;
81  if (uniformProjectionMatrixXx == -1) return;
83  if (uniformProjectionMatrixYy == -1) return;
84 
85  //
87  if (uniformTextureAtlasTextureUnit == -1) return;
88 
89  //
90  for (auto i = 0; i < ATLASTEXTURE_COUNT; i++) {
91  uniformAtlasTextureOrientation[i] = renderer->getProgramUniformLocation(programId, "atlasTextures[" + to_string(i) + "].orientation");
92  if (uniformAtlasTextureOrientation[i] == -1) return;
93  uniformAtlasTexturePosition[i] = renderer->getProgramUniformLocation(programId, "atlasTextures[" + to_string(i) + "].position");
94  if (uniformAtlasTexturePosition[i] == -1) return;
95  uniformAtlasTextureDimension[i] = renderer->getProgramUniformLocation(programId, "atlasTextures[" + to_string(i) + "].dimension");
96  if (uniformAtlasTextureDimension[i] == -1) return;
97  }
98 
99  //
100  initialized = true;
101 }
102 
103 void ParticlesShader::useProgram(int contextIdx)
104 {
105  isRunning = true;
106  renderer->useProgram(contextIdx, programId);
109 }
110 
111 void ParticlesShader::updateEffect(int contextIdx)
112 {
113  // skip if not running
114  if (isRunning == false) return;
115 }
116 
117 void ParticlesShader::unUseProgram(int contextIdx)
118 {
119  isRunning = false;
120  renderer->setTextureUnit(contextIdx, 0);
121  renderer->bindTexture(contextIdx, renderer->ID_NONE);
122 }
123 
125 {
126  // skip if not running
127  if (isRunning == false) return;
128  // object to screen matrix
135 }
136 
137 void ParticlesShader::setTextureAtlas(int contextIdx, TextureAtlas* textureAtlas) {
138  if (textureAtlas->isRequiringUpdate() == true) {
139  textureAtlas->update();
140  if (textureAtlas->getAtlasTexture() != nullptr) {
143  renderer->uploadTexture(contextIdx, textureAtlas->getAtlasTexture());
144  } else
148  }
149  }
150 
151  //
152  auto textureAtlasTexture = textureAtlas->getAtlasTexture();
153  if (textureAtlasTexture == nullptr) return;
154 
155  //
156  auto textureAtlasTextureWidth = textureAtlasTexture->getTextureWidth();
157  auto textureAtlasTextureHeight = textureAtlasTexture->getTextureHeight();
159  for (auto atlasTextureIdx = 0; atlasTextureIdx < ATLASTEXTURE_COUNT; atlasTextureIdx++) {
160  auto atlasTexture = textureAtlas->getAtlasTexture(atlasTextureIdx);
161  if (atlasTexture == nullptr) break;
162  renderer->setProgramUniformInteger(contextIdx, uniformAtlasTextureOrientation[atlasTextureIdx], atlasTexture->orientation);
164  contextIdx,
165  uniformAtlasTexturePosition[atlasTextureIdx],
166  {
167  static_cast<float>(atlasTexture->left) / static_cast<float>(textureAtlasTextureWidth),
168  static_cast<float>(atlasTexture->top) / static_cast<float>(textureAtlasTextureHeight)
169  }
170  );
172  contextIdx,
173  uniformAtlasTextureDimension[atlasTextureIdx],
174  {
175  static_cast<float>(atlasTexture->width) / static_cast<float>(textureAtlasTextureWidth),
176  static_cast<float>(atlasTexture->height) / static_cast<float>(textureAtlasTextureHeight)
177  }
178  );
179  }
180 }
Engine main class.
Definition: Engine.h:131
Texture entity.
Definition: Texture.h:24
void updateMatrices(int contextIdx)
Update matrices to program.
void updateEffect(int contextIdx)
Update effect to program.
void unUseProgram(int contextIdx)
Unuse particles shader program.
array< int32_t, ATLASTEXTURE_COUNT > uniformAtlasTextureOrientation
array< int32_t, ATLASTEXTURE_COUNT > uniformAtlasTexturePosition
void setTextureAtlas(int contextIdx, TextureAtlas *textureAtlas)
Set texture atlas.
void useProgram(int contextIdx)
Use lighting program.
array< int32_t, ATLASTEXTURE_COUNT > uniformAtlasTextureDimension
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 void setProgramUniformFloatVec2(int contextIdx, int32_t uniformId, const array< float, 2 > &data)=0
Set up a float vec2 uniform value.
virtual void setProgramAttributeLocation(int32_t programId, int32_t location, const string &name)=0
Bind attribute to a input location.
virtual int32_t createTexture()=0
Creates a texture.
virtual void setProgramUniformInteger(int contextIdx, int32_t uniformId, int32_t value)=0
Set up a integer uniform value.
virtual bool linkProgram(int32_t programId)=0
Links attached shaders to a program.
virtual void bindTexture(int contextIdx, int32_t textureId)=0
Binds a texture with given id or unbinds when using ID_NONE.
void setLighting(int contextIdx, int32_t lighting)
Set current lighting model.
Definition: Renderer.h:504
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 disposeTexture(int32_t textureId)=0
Dispose a texture.
virtual void uploadTexture(int contextIdx, Texture *texture)=0
Uploads texture data to current bound texture.
virtual void useProgram(int contextIdx, int32_t programId)=0
Use shader program.
virtual void setProgramUniformFloat(int contextIdx, int32_t uniformId, float value)=0
Set up a float uniform value.
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Vector3 multiply(const Vector3 &vector3) const
Multiplies this matrix with vector3.
Definition: Matrix4x4.h:225
Matrix4x4 & set(float r0c0, float r0c1, float r0c2, float r0c3, float r1c0, float r1c1, float r1c2, float r1c3, float r2c0, float r2c1, float r2c2, float r2c3, float r3c0, float r3c1, float r3c2, float r3c3)
Sets this matrix by its components.
Definition: Matrix4x4.h:108
const array< float, 16 > & getArray() const
Definition: Matrix4x4.h:611
const AtlasTexture * getAtlasTexture(int textureIdx)
Returns specific atlas texture information within atlas.
Definition: TextureAtlas.h:73
void update()
Update texture atlas.