Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[GLES2] Added Fog support (probably a bit bugged)
  • Loading branch information
ptitSeb committed Oct 21, 2017
1 parent 26ccf95 commit bdc7008
Show file tree
Hide file tree
Showing 22 changed files with 680 additions and 289 deletions.
6 changes: 6 additions & 0 deletions spec/yml/glext-es2-1.1.yml
Expand Up @@ -85,3 +85,9 @@ glVertexAttrib4f: [void, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat
glVertexAttrib4fv: [void, GLuint index, const GLfloat * v]
glVertexAttribPointer: [void, GLuint index, GLint size, GLenum type, GLboolean normalized,
GLsizei stride, const GLvoid * pointer]


#Other function, probably in no GLES version
glFogCoordf: [void, GLfloat coord]
glFogCoordfv: [void, const GLfloat * coord]
glFogCoordPointer: [void, GLenum type, GLsizei stride, const GLvoid * pointer]
10 changes: 7 additions & 3 deletions src/config.h
Expand Up @@ -44,14 +44,18 @@
#define skip_glStencilMaskSeparate
#define skip_glStencilOpSeparate

#define skip_glFogfv
#define skip_glFogf

#define skip_glShadeModel

#define skip_glAlphaFunc
#define skip_glLogicOp

// fog.c
#define skip_glFogfv
#define skip_glFogf
#define skip_glFogCoordf
#define skip_glFogCoordfv
#define skip_glFogCoordPointer

// getter.c
#define skip_glGetError
#define skip_glGetPointerv
Expand Down
2 changes: 1 addition & 1 deletion src/gl/buffers.h
Expand Up @@ -62,7 +62,7 @@ typedef struct {
} pointer_state_t;

typedef struct {
pointer_state_t vertex, color, normal, tex_coord[MAX_TEX], secondary, fog_coord;
pointer_state_t vertex, color, normal, tex_coord[MAX_TEX], secondary, fog;
} pointer_states_t;

typedef struct {
Expand Down
38 changes: 35 additions & 3 deletions src/gl/fog.c
Expand Up @@ -29,13 +29,14 @@ void gl4es_glFogfv(GLenum pname, const GLfloat* params) {
break;
case GL_FOG_INDEX:
GO(&, index, sizeof(GLfloat))
return; // unsupported on GLES1.1
return; // unsupported for now
case GL_FOG_COLOR:
GO(, color, 4*sizeof(GLfloat))
break;
case GL_FOG_COORD_SRC:
GO(&, coord_src, sizeof(GLfloat))
return; // unsupported on GLES1.1
if(hardext.esversion==1)
return; // unsupported on GLES1.1
default:
errorShim(GL_INVALID_ENUM);
return;
Expand All @@ -50,5 +51,36 @@ void gl4es_glFogf(GLenum pname, GLfloat param) {
gl4es_glFogfv(pname, &param);
}

void gl4es_glFogCoordd(GLdouble coord) {
gl4es_glFogCoordf(coord);
}
void gl4es_glFogCoorddv(const GLdouble *coord) {
gl4es_glFogCoordf(*coord);
}
void gl4es_glFogCoordfv(const GLfloat *coord) {
gl4es_glFogCoordf(*coord);
}
void gl4es_glFogCoordf(GLfloat coord) {
if (glstate->list.active) {
if(glstate->list.pending)
flush();
else
{
rlFogCoordf(glstate->list.active, coord);
glstate->list.active->lastFogCoord = coord;
}
noerrorShim();
} else {
noerrorShim();
}
// change the state last thing
glstate->fogcoord = coord;
}


void glFogfv(GLenum pname, const GLfloat* params) AliasExport("gl4es_glFogfv");
void glFogf(GLenum pname, GLfloat param) AliasExport("gl4es_glFogf");
void glFogf(GLenum pname, GLfloat param) AliasExport("gl4es_glFogf");
void glFogCoordd(GLdouble coord) AliasExport("gl4es_glFogCoordd");
void glFogCoorddv(const GLdouble *coord) AliasExport("gl4es_glFogCoorddv");
void glFogCoordf(GLfloat coord) AliasExport("gl4es_glFogCoordf");
void glFogCoordfv(const GLfloat *coord) AliasExport("gl4es_glFogCoordfv");
4 changes: 4 additions & 0 deletions src/gl/fog.h
Expand Up @@ -15,4 +15,8 @@ typedef struct {

void gl4es_glFogfv(GLenum pname, const GLfloat* params);
void gl4es_glFogf(GLenum pname, GLfloat param);

void gl4es_glFogCoordf(GLfloat coord);
void gl4es_glFogCoordfv(const GLfloat *coord);

#endif
101 changes: 98 additions & 3 deletions src/gl/fpe.c
Expand Up @@ -115,6 +115,10 @@ void fpe_ReleventState(fpe_state_t *dest, fpe_state_t *src)
}
}
}
if(!dest->fog) {
dest->fogmode = 0;
dest->fogsource = 0;
}
}

fpe_fpe_t *fpe_GetCache() {
Expand Down Expand Up @@ -226,6 +230,9 @@ void fpe_EnableDisableClientState(GLenum cap, GLboolean val) {
case GL_SECONDARY_COLOR_ARRAY:
glstate->fpe_client.secondary_array = val;
break;
case GL_FOG_COORD_ARRAY:
glstate->fpe_client.fog_array = val;
break;
}
}

Expand Down Expand Up @@ -282,6 +289,14 @@ void fpe_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid
glstate->fpe_client.tex[glstate->fpe_client.client].pointer = pointer;
}

void fpe_glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer) {
DBG(printf("fpe_glFogPointer(%s, %d, %p)\n", PrintEnum(type), stride, pointer);)
glstate->fpe_client.fog.size = 1;
glstate->fpe_client.fog.type = type;
glstate->fpe_client.fog.stride = stride;
glstate->fpe_client.fog.pointer = pointer;
}

void fpe_glEnable(GLenum cap) {
gl4es_glEnable(cap); // may reset fpe curent program
}
Expand Down Expand Up @@ -333,6 +348,22 @@ void fpe_glMaterialf(GLenum face, GLenum pname, const GLfloat param) {

void fpe_glFogfv(GLenum pname, const GLfloat* params) {
noerrorShim();
if(pname==GL_FOG_MODE) {
int p = *params;
switch(p) {
case GL_EXP: glstate->fpe_state->fogmode = FPE_FOG_EXP; break;
case GL_EXP2: glstate->fpe_state->fogmode = FPE_FOG_EXP2; break;
case GL_LINEAR: glstate->fpe_state->fogmode = FPE_FOG_LINEAR; break;
default: errorShim(GL_INVALID_ENUM);
}
} else if (pname==GL_FOG_COORDINATE_SOURCE) {
int p = *params;
switch(p) {
case GL_FRAGMENT_DEPTH: glstate->fpe_state->fogsource = FPE_FOG_SRC_DEPTH; break;
case GL_FOG_COORD: glstate->fpe_state->fogsource = FPE_FOG_SRC_COORD; break;
default: errorShim(GL_INVALID_ENUM);
}
}
}

void fpe_glPointParameterfv(GLenum pname, const GLfloat * params) {
Expand Down Expand Up @@ -391,7 +422,7 @@ void realize_glenv() {
{
int vaarray = 0;
int id = -1;
// Vertex....
// Vertex
id = glprogram->builtin_attrib[ATT_VERTEX];
if(id!=-1) {
vertexattrib_t *w = &glstate->gleshard.wanted[id];
Expand All @@ -408,7 +439,7 @@ void realize_glenv() {
memcpy(w->current, glstate->vertex, 4*sizeof(GLfloat));
}
}
// Color....
// Color
id = glprogram->builtin_attrib[ATT_COLOR];
if(id!=-1) {
vertexattrib_t *w = &glstate->gleshard.wanted[id];
Expand All @@ -425,6 +456,41 @@ void realize_glenv() {
memcpy(w->current, glstate->color, 4*sizeof(GLfloat));
}
}
// Secondary Color
id = glprogram->builtin_attrib[ATT_SECONDARY];
if(id!=-1) {
vertexattrib_t *w = &glstate->gleshard.wanted[id];
pointer_state_t *p = &glstate->fpe_client.secondary;
w->vaarray = glstate->fpe_client.secondary_array;
if(w->vaarray) {
w->size = p->size;
w->type = p->type;
w->normalized = (p->type==GL_FLOAT)?GL_FALSE:GL_TRUE;
w->stride = p->stride;
w->pointer = p->pointer;
w->buffer = NULL;
} else {
memcpy(w->current, glstate->secondary, 4*sizeof(GLfloat));
}
}
// Fog Coord
id = glprogram->builtin_attrib[ATT_FOGCOORD];
if(id!=-1) {
vertexattrib_t *w = &glstate->gleshard.wanted[id];
pointer_state_t *p = &glstate->fpe_client.fog;
w->vaarray = glstate->fpe_client.fog_array;
if(w->vaarray) {
w->size = p->size;
w->type = p->type;
w->normalized = (p->type==GL_FLOAT)?GL_FALSE:GL_TRUE;
w->stride = p->stride;
w->pointer = p->pointer;
w->buffer = NULL;
} else {
memcpy(w->current, &glstate->fogcoord, 1*sizeof(GLfloat));
memset(w->current+1, 0, 3*sizeof(GLfloat));
}
}
// TexCoordX
for(int tex=0; tex<hardext.maxtex; tex++) {
id = glprogram->builtin_attrib[ATT_MULTITEXCOORD0+tex];
Expand All @@ -444,7 +510,7 @@ void realize_glenv() {
}
}
}
// Normal....
// Normal
id = glprogram->builtin_attrib[ATT_NORMAL];
if(id!=-1) {
vertexattrib_t *w = &glstate->gleshard.wanted[id];
Expand Down Expand Up @@ -606,6 +672,18 @@ void realize_glenv() {
GoUniformfv(glprogram, glprogram->builtin_lightmodelprod[1].sceneColor, 4, 1, tmp);
}
}
// fog parameters
if(glprogram->has_builtin_fog)
{
GoUniformfv(glprogram, glprogram->builtin_fog.color, 4, 1, glstate->fog.color);
GoUniformfv(glprogram, glprogram->builtin_fog.density, 1, 1, &glstate->fog.density);
GoUniformfv(glprogram, glprogram->builtin_fog.start, 1, 1, &glstate->fog.start);
GoUniformfv(glprogram, glprogram->builtin_fog.end, 1, 1, &glstate->fog.end);
if(glprogram->builtin_fog.scale!=-1) {
GLfloat tmp = 1.f/(glstate->fog.end - glstate->fog.start);
GoUniformfv(glprogram, glprogram->builtin_fog.scale, 1, 1, &tmp);
}
}
// check point sprite if needed
if(glprogram->has_builtin_pointsprite)
{
Expand Down Expand Up @@ -805,6 +883,11 @@ void builtin_Init(program_t *glprogram) {
}
glprogram->builtin_texsampler[i] = -1;
}
glprogram->builtin_fog.color = -1;
glprogram->builtin_fog.density = -1;
glprogram->builtin_fog.start = -1;
glprogram->builtin_fog.end = -1;
glprogram->builtin_fog.scale = -1;
// fpe uniform
glprogram->fpe_alpharef = -1;
// initialise emulated builtin attrib to -1
Expand Down Expand Up @@ -837,6 +920,7 @@ const char* alpharef_code = "_gl4es_AlphaRef";
const char* fpetexSampler_code = "_gl4es_TexSampler_";
const char* fpetexenvRGBScale_code = "_gl4es_TexEnvRGBScale_";
const char* fpetexenvAlphaScale_code = "_gl4es_TexEnvAlphaScale_";
const char* fog_code = "_gl4es_Fog.";
int builtin_CheckUniform(program_t *glprogram, char* name, GLint id, int size) {
if(strncmp(name, gl4es_code, strlen(gl4es_code)))
return 0; // doesn't start with "_gl4es_", no need to look further
Expand Down Expand Up @@ -919,6 +1003,17 @@ int builtin_CheckUniform(program_t *glprogram, char* name, GLint id, int size) {
return 1;
}
}
if(strncmp(name, fog_code, strlen(fog_code))==0)
{
// it's a Fog parameter
if(strstr(name, "color")) glprogram->builtin_fog.color = id;
else if(strstr(name, "density")) glprogram->builtin_fog.density = id;
else if(strstr(name, "start")) glprogram->builtin_fog.start = id;
else if(strstr(name, "end")) glprogram->builtin_fog.end = id;
else if(strstr(name, "scale")) glprogram->builtin_fog.scale = id;
glprogram->has_builtin_fog = 1;
return 1;
}
if(strncmp(name, point_code, strlen(point_code))==0)
{
// it's a Point parameter
Expand Down
13 changes: 9 additions & 4 deletions src/gl/fpe.h
Expand Up @@ -12,10 +12,12 @@
*/

#define FPE_FOG_OFF 0
#define FPE_FOG_LINEAR 1
#define FPE_FOG_EXP 2
#define FPE_FOG_EXP2 3
#define FPE_FOG_EXP 0
#define FPE_FOG_EXP2 1
#define FPE_FOG_LINEAR 2

#define FPE_FOG_SRC_DEPTH 0
#define FPE_FOG_SRC_COORD 1

#define FPE_TEX_OFF 0
#define FPE_TEX_2D 1
Expand Down Expand Up @@ -95,6 +97,8 @@ typedef struct {
unsigned int texenv:24; // 8 texenv flags, each stored on 3bits
unsigned int plane:6; // 6 planes packed
unsigned int fogmode:2; // fog mode
unsigned int fogsource:1; // fog source
unsigned int fog:1; // Fog enabled or not
unsigned int colorsum:1; // secondary color enabled
unsigned int lighting:1; // global lighting enabled
unsigned int normalize:1; // normalization
Expand Down Expand Up @@ -133,6 +137,7 @@ void fpe_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *
void fpe_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
void fpe_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
void fpe_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
void fpe_glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
void fpe_glEnable(GLenum cap);
void fpe_glDisable(GLenum cap);
void fpe_glDrawArrays(GLenum mode, GLint first, GLsizei count);
Expand Down

0 comments on commit bdc7008

Please sign in to comment.