@@ -1204,6 +1204,7 @@ namespace olc
12041204 0 , 0 , 0 , 1
12051205 } };
12061206 olc::CullMode cull = olc::CullMode::NONE ;
1207+ olc::Pixel tint = olc::WHITE ;
12071208 };
12081209
12091210 struct LayerDesc
@@ -1764,6 +1765,7 @@ namespace olc
17641765 typedef void CALLSTYLE locUniform1f_t (GLint location, GLfloat v0);
17651766 typedef void CALLSTYLE locUniform1i_t (GLint location, GLint v0);
17661767 typedef void CALLSTYLE locUniform2fv_t (GLint location, GLsizei count, const GLfloat* value);
1768+ typedef void CALLSTYLE locUniform4fv_t (GLint location, GLsizei count, const GLfloat* value);
17671769 typedef void CALLSTYLE locUniformMatrix4fv_t (GLint location, GLsizei count, GLboolean trasnpose, const GLfloat* value);
17681770 typedef void CALLSTYLE locActiveTexture_t (GLenum texture);
17691771 typedef void CALLSTYLE locGenFrameBuffers_t (GLsizei n, GLuint* ids);
@@ -3535,6 +3537,7 @@ namespace olc
35353537 task.depth = bHW3DDepthTest;
35363538 task.cull = nHW3DCullMode;
35373539 task.mvp = matModelView;
3540+ task.tint = tint;
35383541 task.vb .resize (pos.size ());
35393542
35403543 for (size_t i = 0 ; i < pos.size (); i++)
@@ -3552,6 +3555,7 @@ namespace olc
35523555 task.depth = bHW3DDepthTest;
35533556 task.cull = nHW3DCullMode;
35543557 task.mvp = matModelView;
3558+ task.tint = olc::WHITE ;
35553559 task.vb =
35563560 {
35573561 { pos1[0 ], pos1[1 ], pos1[2 ], 1 .0f , 0 .0f , 0 .0f , col.n },
@@ -3570,6 +3574,7 @@ namespace olc
35703574 task.depth = bHW3DDepthTest;
35713575 task.cull = nHW3DCullMode;
35723576 task.mvp = matModelView;
3577+ task.tint = olc::WHITE ;
35733578
35743579 const float ox = pos[0 ];
35753580 const float oy = pos[1 ];
@@ -5453,42 +5458,24 @@ namespace olc
54535458 // x y z w u v rgb
54545459 // std::vector<std::tuple<float, float, float, float, float, float, uint32_t>> vb;
54555460
5461+ float f[4 ] = { float (task.tint .r ) / 255 .0f , float (task.tint .g ) / 255 .0f , float (task.tint .b ) / 255 .0f , float (task.tint .a ) / 255 .0f };
5462+
54565463 if (task.depth )
54575464 {
5458-
5459- // // Render as 3D Spatial Entity
5460- // for (uint32_t n = 0; n < decal.points; n++)
5461- // {
5462- // glColor4ub(decal.tint[n].r, decal.tint[n].g, decal.tint[n].b, decal.tint[n].a);
5463- // glTexCoord4f(decal.uv[n].x, decal.uv[n].y, 0.0f, decal.w[n]);
5464- // glVertex3f(decal.pos[n].x, decal.pos[n].y, decal.z[n]);
5465- // }
5466-
54675465 for (uint32_t n = 0 ; n < task.vb .size (); n++)
54685466 {
54695467 olc::Pixel p = task.vb [n].c ;
5470- glColor4ub (p.r , p.g , p.b , p.a );
5468+ glColor4ub (GLubyte ( p.r * f[ 0 ]), GLubyte ( p.g * f[ 1 ]), GLubyte ( p.b * f[ 2 ]), GLubyte ( p.a * f[ 3 ]) );
54715469 glTexCoord2f (task.vb [n].p [4 ], task.vb [n].p [5 ]);
54725470 glVertex4f (task.vb [n].p [0 ], task.vb [n].p [1 ], task.vb [n].p [2 ], task.vb [n].p [3 ]);
54735471 }
54745472 }
54755473 else
54765474 {
5477-
5478-
5479- // // Render as 2D Spatial entity
5480- // for (uint32_t n = 0; n < task.vb.size(); n++)
5481- // {
5482- // olc::Pixel p = std::get<6>(task.vb[n]);
5483- // glColor4ub(p.r, p.g, p.b, p.a);
5484- // glTexCoord4f(std::get<4>(task.vb[n]), std::get<5>(task.vb[n]), 0.0f, std::get<3>(task.vb[n]));
5485- // glVertex2f(std::get<0>(task.vb[n]), std::get<1>(task.vb[n]));
5486- // }
5487-
54885475 for (uint32_t n = 0 ; n < task.vb .size (); n++)
54895476 {
54905477 olc::Pixel p = task.vb [n].c ;
5491- glColor4ub (p.r , p.g , p.b , p.a );
5478+ glColor4ub (GLubyte ( p.r * f[ 0 ]), GLubyte ( p.g * f[ 1 ]), GLubyte ( p.b * f[ 2 ]), GLubyte ( p.a * f[ 3 ]) );
54925479 glVertex4f (task.vb [n].p [4 ], task.vb [n].p [5 ], 0 .0f , task.vb [n].p [3 ]);
54935480 glTexCoord2f (task.vb [n].p [0 ], task.vb [n].p [1 ]);
54945481 }
@@ -5724,6 +5711,7 @@ namespace olc
57245711 locGetUniformLocation_t* locGetUniformLocation = nullptr ;
57255712 locUniformMatrix4fv_t* locUniformMatrix4fv = nullptr ;
57265713 locUniform1i_t* locUniform1i = nullptr ;
5714+ locUniform4fv_t* locUniform4fv = nullptr ;
57275715
57285716 uint32_t m_nFS = 0 ;
57295717 uint32_t m_nVS = 0 ;
@@ -5733,6 +5721,7 @@ namespace olc
57335721
57345722 uint32_t m_uniMVP = 0 ;
57355723 uint32_t m_uniIs3D = 0 ;
5724+ uint32_t m_uniTint = 0 ;
57365725
57375726 struct locVertex
57385727 {
@@ -5871,6 +5860,7 @@ namespace olc
58715860 locUseProgram = OGL_LOAD (locUseProgram_t, glUseProgram);
58725861 locGetShaderInfoLog = OGL_LOAD (locGetShaderInfoLog_t, glGetShaderInfoLog);
58735862 locUniform1i = OGL_LOAD (locUniform1i_t, glUniform1i);
5863+ locUniform4fv = OGL_LOAD (locUniform4fv_t, glUniform4fv);
58745864 locUniformMatrix4fv = OGL_LOAD (locUniformMatrix4fv_t, glUniformMatrix4fv);
58755865 locGetUniformLocation = OGL_LOAD (locGetUniformLocation_t, glGetUniformLocation);
58765866#if !defined(OLC_PLATFORM_EMSCRIPTEN)
@@ -5911,9 +5901,10 @@ namespace olc
59115901 " layout(location = 2) in vec4 aCol;\n "
59125902 " uniform mat4 mvp;\n "
59135903 " uniform int is3d;\n "
5904+ " uniform vec4 tint;\n "
59145905 " out vec2 oTex;\n "
59155906 " out vec4 oCol;\n "
5916- " void main(){ if(is3d!=0) {gl_Position = mvp * vec4(aPos.x, aPos.y, aPos.z, 1.0); oTex = aTex;} else {float p = 1.0 / aPos.z; gl_Position = p * vec4(aPos.x, aPos.y, 0.0, 1.0); oTex = p * aTex;} oCol = aCol;}" ;
5907+ " void main(){ if(is3d!=0) {gl_Position = mvp * vec4(aPos.x, aPos.y, aPos.z, 1.0); oTex = aTex;} else {float p = 1.0 / aPos.z; gl_Position = p * vec4(aPos.x, aPos.y, 0.0, 1.0); oTex = p * aTex;} oCol = aCol * tint ;}" ;
59175908 locShaderSource (m_nVS, 1 , &strVS, NULL );
59185909 locCompileShader (m_nVS);
59195910
@@ -5924,8 +5915,11 @@ namespace olc
59245915
59255916 m_uniMVP = locGetUniformLocation (m_nQuadShader, " mvp" );
59265917 m_uniIs3D = locGetUniformLocation (m_nQuadShader, " is3d" );
5918+ m_uniTint = locGetUniformLocation (m_nQuadShader, " tint" );
59275919 locUniform1i (m_uniIs3D, 0 );
5928- locUniformMatrix4fv (m_uniMVP, 1 , false , matProjection.data ());
5920+ locUniformMatrix4fv (m_uniMVP, 16 , false , matProjection.data ());
5921+ float f[4 ] = { 100 .0f , 100 .0f , 100 .0f , 100 .0f };
5922+ locUniform4fv (m_uniTint, 4 , f);
59295923
59305924 // Create Quad
59315925 locGenBuffers (1 , &m_vbQuad);
@@ -6002,6 +5996,8 @@ namespace olc
60025996 glBlendFunc (GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA );
60035997 locUseProgram (m_nQuadShader);
60045998 locBindVertexArray (m_vaQuad);
5999+ float f[4 ] = { 1 .0f , 1 .0f , 1 .0f , 1 .0f };
6000+ locUniform4fv (m_uniTint, 1 , f);
60056001
60066002#if defined(OLC_PLATFORM_EMSCRIPTEN)
60076003 locVertexAttribPointer (0 , 4 , GL_FLOAT , GL_FALSE , sizeof (locVertex), 0 ); locEnableVertexAttribArray (0 );
@@ -6047,6 +6043,8 @@ namespace olc
60476043 locBufferData (0x8892 , sizeof (locVertex) * 4 , verts, 0x88E0 );
60486044
60496045 locUniform1i (m_uniIs3D, 0 );
6046+ float f[4 ] = { 1 .0f , 1 .0f , 1 .0f , 1 .0f };
6047+ locUniform4fv (m_uniTint, 1 , f);
60506048 glDrawArrays (GL_TRIANGLE_STRIP , 0 , 4 );
60516049 }
60526050
@@ -6066,6 +6064,10 @@ namespace olc
60666064
60676065 locBufferData (0x8892 , sizeof (locVertex) * decal.points , pVertexMem, 0x88E0 );
60686066 locUniform1i (m_uniIs3D, 0 );
6067+
6068+ float f[4 ] = { 1 .0f , 1 .0f , 1 .0f , 1 .0f };
6069+ locUniform4fv (m_uniTint, 1 , f);
6070+
60696071 if (nDecalMode == DecalMode::WIREFRAME )
60706072 glDrawArrays (GL_LINE_LOOP , 0 , decal.points );
60716073 else
@@ -6186,6 +6188,9 @@ namespace olc
61866188 + matProjection[3 * 4 + r] * task.mvp [c * 4 + 3 ];
61876189 locUniformMatrix4fv (m_uniMVP, 1 , false , matMVP.data ());
61886190
6191+ float f[4 ] = { float (task.tint .r ) / 255 .0f , float (task.tint .g ) / 255 .0f , float (task.tint .b ) / 255 .0f , float (task.tint .a ) / 255 .0f };
6192+ locUniform4fv (m_uniTint, 1 , f);
6193+
61896194
61906195 if (task.cull == olc::CullMode::NONE )
61916196 {
0 commit comments