Forgot to add that up, i am using uniform buffers to upload the data.

Code :
auto offset = 0;
	dirlightBuffer.bindBuffer();
	auto componentSize = (3 * sizeof(glm::vec4));
	auto size = componentSize * dirLights.size();
	dirlightBuffer.allocateBuffer(size, GL_DYNAMIC_DRAW);
	for (size_t i = 0; i < dirLights.size(); i++)
	{
		dirlightBuffer.bufferSubData(dirLights[i]->getColor(), 0 + offset);
		dirlightBuffer.bufferSubData(dirLights[i]->calculateModelMatrix() * glm::vec4(1), sizeof(glm::vec4) + offset);
		dirlightBuffer.bufferSubData(dirLights[i]->getAttenuation(), (sizeof(glm::vec4) * 2) + offset);
		offset += componentSize;
	}
	dirlightBuffer.unbindBuffer();
 
 
struct DirLightData {
	vec4 color;
	vec4 lightpos;
	vec4 attenuation;
};
 
layout(std140) uniform DirLightBlock {
	DirLightData dirLight[10];
};

That is the light comming from the OpenGL code, but i have tested the values inside this struct and it seems fine and correct. Ignore the naming, it is badly selected