[SOLVED] Cube won't render if using struct for locations

Hi everyone, sorry if the title of the topic sounds misleading or confusing.

I’ve been banging my head on the wall for quite a time now, and I reckon my issue comes from something really dumb.

I’ll try to be brief and not overwhelm you with endless code.

Here goes :

My DirectionalLight.h (main light used in the program) :

#ifndef DIRECTIONALLIGHT_H
#define DIRECTIONALLIGHT_H

#include "BaseLight.h"

class DirectionalLight : public BaseLight
{
public:
	DirectionalLight();
	DirectionalLight(glm::vec3 colour, GLfloat ambientIntensity, GLfloat diffuseIntensity, glm::vec3 direction);
	~DirectionalLight();

	void UseLight(GLfloat ambientColourLocation, GLfloat ambientIntensityLocation, GLfloat diffuseIntensityLocation, GLfloat directionLocation);

	glm::vec3 GetDirection() const { return mDirection; }
private:
	glm::vec3 mDirection;
};

#endif

The method that I use (apart from others - untouched either) to render the cube :

void DirectionalLight::UseLight(GLfloat ambientColourLocation, GLfloat ambientIntensityLocation, GLfloat diffuseIntensityLocation, GLfloat directionLocation)
{
	glUniform3f(
		ambientColourLocation,
		mAmbientColour.x,
		mAmbientColour.y,
		mAmbientColour.z
	);
	glUniform1f(ambientIntensityLocation, mAmbientIntensity);
	glUniform3f(
		directionLocation,
		mDirection.x,
		mDirection.y,
		mDirection.z
	);
	glUniform1f(diffuseIntensityLocation, mDiffuseIntensity);
}

My former Shader.h :

#ifndef SHADER_H
#define SHADER_H

#include "Util.h"

class Shader
{
public:
	Shader();
	~Shader();

	void CreateFromString(const char* vertexCode, const char* fragmentCode);
	void CreateFromFiles(const char* vertexShaderLocation, const char* fragmentShaderLocation);

	std::string ReadFile(const char* fileLocation);

	GLuint GetProjectionLocation() const { return mUniformProjection; }
	GLuint GetViewLocation() const { return mUniformView; }
	GLuint GetModelLocation() const { return mUniformModel; }
	GLuint GetEyePositionLocation() const { return mUniformEyePosition; }

	GLuint GetAmbientColourLocation() const { return mUniformAmbientColour; }
	GLuint GetAmbientIntensityLocation() const { return mUniformAmbientIntensity; }
	GLuint GetDiffuseColourLocation() const { return mUniformDiffuseColour; }
	GLuint GetDiffuseIntensityLocation() const { return mUniformDiffuseIntensity; }
	GLuint GetDirectionLocation() const { return mUniformDirection; }

	GLuint GetSpecularIntensityLocation() const { return mUniformSpecularIntensity; }
	GLuint GetShininessLocation() const { return mUniformShininess; }

	void UseShader();
	void ClearShader();	

private:
	bool AddShader(GLuint theProgram, const char* shaderCode, GLenum shaderType);
	bool CompileShader(const char* vertexCode, const char* fragmentCode);

private:
	GLuint mShaderID;
	GLuint mUniformProjection;
	GLuint mUniformView;
	GLuint mUniformModel;
	GLuint mUniformEyePosition;

	GLuint mUniformAmbientColour;
	GLuint mUniformAmbientIntensity;
	GLuint mUniformDiffuseColour;
	GLuint mUniformDirection;
	GLuint mUniformDiffuseIntensity;

	GLuint mUniformSpecularIntensity;
	GLuint mUniformShininess;
};

#endif

Then in the Render function in main, I use :

mDirectionalLight.UseLight(
			mShaderList[0].GetAmbientColourLocation(),
			mShaderList[0].GetAmbientIntensityLocation(),
			mShaderList[0].GetDiffuseIntensityLocation(),
			mShaderList[0].GetDirectionLocation()
		);

Outcome : Everything goes fine.

Now…

My new Shader.h :

#ifndef SHADER_H
#define SHADER_H

#include "DirectionalLight.h"
#include "PointLight.h"

struct UniformDirectionalLight
{
	GLuint uniformColour;
	GLuint uniformAmbientIntensity;
	GLuint uniformDiffuseIntensity;
	GLuint uniformDirection;
};

class Shader
{
public:
	Shader();
	~Shader();

	void CreateFromString(const char* vertexCode, const char* fragmentCode);
	void CreateFromFiles(const char* vertexShaderLocation, const char* fragmentShaderLocation);

	std::string ReadFile(const char* fileLocation);

	GLuint GetProjectionLocation() const { return mUniformProjection; }
	GLuint GetViewLocation() const { return mUniformView; }
	GLuint GetModelLocation() const { return mUniformModel; }
	GLuint GetEyePositionLocation() const { return mUniformEyePosition; }

	GLuint GetAmbientColourLocation() const { return mUniformDirectionalLight.uniformColour; }
	GLuint GetAmbientIntensityLocation() const { return mUniformDirectionalLight.uniformAmbientIntensity; }
	GLuint GetDiffuseIntensityLocation() const { return mUniformDirectionalLight.uniformDiffuseIntensity; }
	GLuint GetDirectionLocation() const { return mUniformDirectionalLight.uniformDirection; }

	GLuint GetSpecularIntensityLocation() const { return mUniformSpecularIntensity; }
	GLuint GetShininessLocation() const { return mUniformShininess; }

	void SetDirectionalLight(DirectionalLight* directionalLight); // Problems come from here

	void UseShader();
	void ClearShader();	

private:
	bool AddShader(GLuint theProgram, const char* shaderCode, GLenum shaderType);
	bool CompileShader(const char* vertexCode, const char* fragmentCode);

private:
	int mPointLightCount;

	UniformDirectionalLight mUniformDirectionalLight;

	GLuint mShaderID;
	GLuint mUniformProjection;
	GLuint mUniformView;
	GLuint mUniformModel;
	GLuint mUniformEyePosition;

	GLuint mUniformSpecularIntensity;
	GLuint mUniformShininess;
};

#endif

The SetDirectionalLight method :

void Shader::SetDirectionalLight(DirectionalLight* directionalLight)
{
	directionalLight->UseLight(
		mUniformDirectionalLight.uniformAmbientIntensity,
		mUniformDirectionalLight.uniformColour,
		mUniformDirectionalLight.uniformDiffuseIntensity,
		mUniformDirectionalLight.uniformDirection
	);
}

And now I use this in the Render function :

mShaderList[0].SetDirectionalLight(&mDirectionalLight);

Outcome : NOK, nothing appears at all.

Any clues ? This has to be something very silly but here it’s past 3 AM… You get the idea.

I’ll provide some more explanations and/or code if need be.

Thousand thanks to you guys.

Skelkingr

Problem solved :

I had flipped the two first parameters passed to UseLight.