More lighting optimisations
This commit is contained in:
parent
af82f7632f
commit
0a92240c64
|
@ -332,31 +332,32 @@ GL_FORCE_INLINE void bgra_to_float(const uint8_t* input, GLfloat* output) {
|
||||||
output[3] = ((float) input[A8IDX]) * scale;
|
output[3] = ((float) input[A8IDX]) * scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glUpdateColourMaterial(const GLubyte* argb) {
|
void _glUpdateColourMaterialA(const GLubyte* argb) {
|
||||||
if(!_glIsColorMaterialEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
float colour[4];
|
float colour[4];
|
||||||
bgra_to_float(argb, colour);
|
bgra_to_float(argb, colour);
|
||||||
|
vec4cpy(MATERIAL.ambient, colour);
|
||||||
|
_glPrecalcLightingValues(COLOR_MATERIAL_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
switch(COLOR_MATERIAL_MODE) {
|
void _glUpdateColourMaterialD(const GLubyte* argb) {
|
||||||
case GL_AMBIENT:
|
float colour[4];
|
||||||
vec4cpy(MATERIAL.ambient, colour);
|
bgra_to_float(argb, colour);
|
||||||
break;
|
vec4cpy(MATERIAL.diffuse, colour);
|
||||||
case GL_DIFFUSE:
|
_glPrecalcLightingValues(COLOR_MATERIAL_MASK);
|
||||||
vec4cpy(MATERIAL.diffuse, colour);
|
}
|
||||||
break;
|
|
||||||
case GL_EMISSION:
|
|
||||||
vec4cpy(MATERIAL.emissive, colour);
|
|
||||||
break;
|
|
||||||
case GL_AMBIENT_AND_DIFFUSE:
|
|
||||||
default: {
|
|
||||||
vec4cpy(MATERIAL.ambient, colour);
|
|
||||||
vec4cpy(MATERIAL.diffuse, colour);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
void _glUpdateColourMaterialE(const GLubyte* argb) {
|
||||||
|
float colour[4];
|
||||||
|
bgra_to_float(argb, colour);
|
||||||
|
vec4cpy(MATERIAL.emissive, colour);
|
||||||
|
_glPrecalcLightingValues(COLOR_MATERIAL_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glUpdateColourMaterialAD(const GLubyte* argb) {
|
||||||
|
float colour[4];
|
||||||
|
bgra_to_float(argb, colour);
|
||||||
|
vec4cpy(MATERIAL.ambient, colour);
|
||||||
|
vec4cpy(MATERIAL.diffuse, colour);
|
||||||
_glPrecalcLightingValues(COLOR_MATERIAL_MASK);
|
_glPrecalcLightingValues(COLOR_MATERIAL_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,12 +451,38 @@ void _glPerformLighting(Vertex* vertices, const EyeSpaceData* es, const int32_t
|
||||||
/* Final colour of lighting output (will be clamped to argb) */
|
/* Final colour of lighting output (will be clamped to argb) */
|
||||||
float final[4];
|
float final[4];
|
||||||
|
|
||||||
for(j = 0; j < count; ++j, ++vertex, ++data) {
|
/* Calculate the colour material function once */
|
||||||
_glUpdateColourMaterial(vertex->bgra);
|
void (*updateColourMaterial)(const GLubyte*) = NULL;
|
||||||
|
|
||||||
|
if(_glIsColorMaterialEnabled()) {
|
||||||
|
switch(COLOR_MATERIAL_MODE) {
|
||||||
|
case GL_AMBIENT:
|
||||||
|
updateColourMaterial = _glUpdateColourMaterialA;
|
||||||
|
break;
|
||||||
|
case GL_DIFFUSE:
|
||||||
|
updateColourMaterial = _glUpdateColourMaterialD;
|
||||||
|
break;
|
||||||
|
case GL_EMISSION:
|
||||||
|
updateColourMaterial = _glUpdateColourMaterialE;
|
||||||
|
break;
|
||||||
|
case GL_AMBIENT_AND_DIFFUSE:
|
||||||
|
updateColourMaterial = _glUpdateColourMaterialAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate the ambient lighting and set up colour material */
|
||||||
|
for(j = 0; j < count; ++j, ++vertex) {
|
||||||
|
if(updateColourMaterial) {
|
||||||
|
updateColourMaterial(vertex->bgra);
|
||||||
|
}
|
||||||
|
|
||||||
/* Copy the base colour across */
|
/* Copy the base colour across */
|
||||||
vec4cpy(final, MATERIAL.baseColour);
|
vec4cpy(final, MATERIAL.baseColour);
|
||||||
|
}
|
||||||
|
|
||||||
|
vertex = vertices;
|
||||||
|
for(j = 0; j < count; ++j, ++vertex, ++data) {
|
||||||
/* Direction to vertex in eye space */
|
/* Direction to vertex in eye space */
|
||||||
float Vx = -data->xyz[0];
|
float Vx = -data->xyz[0];
|
||||||
float Vy = -data->xyz[1];
|
float Vy = -data->xyz[1];
|
||||||
|
|
Loading…
Reference in New Issue
Block a user