139 lines
3.3 KiB
C
139 lines
3.3 KiB
C
|
|
/*
|
|
TODO: glGetX() fog values
|
|
*/
|
|
|
|
#include <limits.h>
|
|
#include "private.h"
|
|
|
|
static struct {
|
|
GLfloat START;
|
|
GLfloat END;
|
|
GLfloat DENSITY;
|
|
GLenum MODE;
|
|
GLfloat COLOR[4];
|
|
} FOG = {
|
|
0.0f, 1.0f, 1.0f, GL_EXP, { 0.0f, 0.0f, 0.0f, 0.0f }
|
|
};
|
|
|
|
static void updatePVRFog(void) {
|
|
switch(FOG.MODE) {
|
|
case GL_LINEAR:
|
|
GPUSetFogLinear(FOG.START, FOG.END);
|
|
break;
|
|
|
|
case GL_EXP:
|
|
GPUSetFogExp(FOG.DENSITY);
|
|
break;
|
|
|
|
case GL_EXP2:
|
|
GPUSetFogExp2(FOG.DENSITY);
|
|
break;
|
|
}
|
|
|
|
GPUSetFogColor(FOG.COLOR[3], FOG.COLOR[0], FOG.COLOR[1], FOG.COLOR[2]);
|
|
}
|
|
|
|
void APIENTRY glFogf(GLenum pname, GLfloat param) {
|
|
switch(pname) {
|
|
case GL_FOG_DENSITY:
|
|
if(FOG.DENSITY != param) {
|
|
if(param < 0.0f)
|
|
_glKosThrowError(GL_INVALID_VALUE, __func__);
|
|
else {
|
|
FOG.DENSITY = param;
|
|
updatePVRFog();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case GL_FOG_START:
|
|
if(FOG.START != param) {
|
|
FOG.START = param;
|
|
updatePVRFog();
|
|
}
|
|
break;
|
|
|
|
case GL_FOG_END:
|
|
if(FOG.END != param) {
|
|
FOG.END = param;
|
|
updatePVRFog();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
|
}
|
|
}
|
|
|
|
void APIENTRY glFogi(GLenum pname, GLint param) {
|
|
switch(pname) {
|
|
case GL_FOG_DENSITY:
|
|
case GL_FOG_START:
|
|
case GL_FOG_END:
|
|
glFogf(pname, (GLfloat)param);
|
|
break;
|
|
|
|
case GL_FOG_MODE:
|
|
if(FOG.MODE != param) {
|
|
switch(param) {
|
|
case GL_LINEAR:
|
|
case GL_EXP:
|
|
case GL_EXP2:
|
|
FOG.MODE = param;
|
|
updatePVRFog();
|
|
break;
|
|
|
|
default:
|
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case GL_FOG_INDEX:
|
|
default:
|
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
|
}
|
|
}
|
|
|
|
void APIENTRY glFogfv(GLenum pname, const GLfloat* params) {
|
|
switch(pname) {
|
|
case GL_FOG_COLOR: {
|
|
GLfloat color[] = {
|
|
CLAMP(params[0], 0.0f, 1.0f),
|
|
CLAMP(params[1], 0.0f, 1.0f),
|
|
CLAMP(params[2], 0.0f, 1.0f),
|
|
CLAMP(params[3], 0.0f, 1.0f)
|
|
};
|
|
|
|
if(memcmp(color, FOG.COLOR, sizeof(float) * 4)) {
|
|
memcpy(FOG.COLOR, color, sizeof(float) * 4);
|
|
updatePVRFog();
|
|
}
|
|
break;
|
|
}
|
|
|
|
default:
|
|
glFogf(pname, *params);
|
|
}
|
|
}
|
|
|
|
void APIENTRY glFogiv(GLenum pname, const GLint* params) {
|
|
switch(pname) {
|
|
case GL_FOG_COLOR: {
|
|
GLfloat color[] = {
|
|
(GLfloat)params[0] / (GLfloat)INT_MAX,
|
|
(GLfloat)params[1] / (GLfloat)INT_MAX,
|
|
(GLfloat)params[2] / (GLfloat)INT_MAX,
|
|
(GLfloat)params[3] / (GLfloat)INT_MAX,
|
|
};
|
|
|
|
glFogfv(pname, color);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
glFogi(pname, *params);
|
|
}
|
|
}
|