As explained here, it is possible to switch some features of a shader on and off by preprocessor defines. However, these defines all have a boolean character (defined or not defined). I would like to do something like this:
[java]
uniform vec3 m_ProjectorLocation[NUM_PROJECTORS];
uniform mat4 m_ProjectorViewProjectionMatrix[NUM_PROJECTORS];
for (int i = 0; i < NUM_PROJECTORS; i++)
{
vec3 pl = m_ProjectorLocation;
mat4 pm = m_ProjectorViewProjectionMatrix;
// process an arbitrary number of projectors in a single pass
}
[/java]
Is it possible to define an integer constant at runtime by something like “mat.setParam(…);”. If so, please tell me how.
Unfortunately, the wiki says nothing about defining integer constants. It’s all (implicit) boolean.
Edit: This should do what I want:
[java]material.getMaterialDef().getDefaultTechniques().get(0).addShaderPresetDefine(“NUM_PROJECTORS”, VarType.Int, 10);[/java]
You have to do like you do with booleans. Set this in the j3md material parameters:
Int NumProjectors
Then you do a define:
NUM_PROJECTORS : NumProjectors
You always work with the NumProjectors variable from the app, but with NUM_PROJECTORS in the shader.
Btw. defines aren’t implicit boolean, works like in C.
EDIT: Not sure you have to do that tbh, but it works.
Thank you! I had a brain bug. I thought the preprocessor defines were just defined like
[java]#define NUM_PROJECTORS[/java]
but they are in fact defined with an adequate value depending on the variable type.
Sorry, sometimes I’m a bit slow on the uptake. Thanks again to both of you!