implemented fog for gl3

This commit is contained in:
aap
2016-07-05 18:22:22 +02:00
parent abe0bba5af
commit dcbbdfe6b2
7 changed files with 78 additions and 21 deletions

View File

@@ -19,8 +19,13 @@ namespace gl3 {
struct UniformState
{
int alphaFunc;
int32 alphaFunc;
float32 alphaRef;
int32 fogEnable;
float32 fogStart;
float32 fogEnd;
int32 pad[3];
RGBAf fogColor;
};
struct UniformScene
@@ -126,16 +131,29 @@ setRenderState(int32 state, uint32 value)
glDepthMask(zwrite);
}
break;
case FOGENABLE:
if(uniformState.fogEnable != value){
uniformState.fogEnable = value;
stateDirty = 1;
}
break;
case FOGCOLOR:
// no cache check here...too lazy
convColor(&uniformState.fogColor, (RGBA*)&value);
stateDirty = 1;
break;
case ALPHATESTFUNC:
uniformState.alphaFunc = value;
stateDirty = 1;
if(uniformState.alphaFunc != value){
uniformState.alphaFunc = value;
stateDirty = 1;
}
break;
case ALPHATESTREF:
uniformState.alphaRef = value/255.0f;
stateDirty = 1;
break;
case ZTESTFUNC:
if(uniformState.alphaRef != value/255.0f){
uniformState.alphaRef = value/255.0f;
stateDirty = 1;
}
break;
}
}
@@ -143,6 +161,7 @@ setRenderState(int32 state, uint32 value)
uint32
getRenderState(int32 state)
{
RGBA rgba;
switch(state){
case VERTEXALPHA:
return vertexAlpha;
@@ -154,14 +173,18 @@ getRenderState(int32 state)
return ztest;
case ZWRITEENABLE:
return zwrite;
case FOGENABLE:
return uniformState.fogEnable;
case FOGCOLOR:
convColor(&rgba, &uniformState.fogColor);
return *(uint32*)&rgba;
case ALPHATESTFUNC:
return uniformState.alphaFunc;
case ALPHATESTREF:
return uniformState.alphaRef*255.0f;
case ZTESTFUNC:
break;
}
return 0;
}
void
@@ -169,6 +192,9 @@ resetRenderState(void)
{
uniformState.alphaFunc = ALPHAGREATERTHAN;
uniformState.alphaRef = 10.0f/255.0f;
uniformState.fogEnable = 0;
uniformState.fogStart = 0.0f;
uniformState.fogColor = { 1.0f, 1.0f, 1.0f, 1.0f };
stateDirty = 1;
vertexAlpha = 0;
@@ -296,6 +322,22 @@ flushCache(void)
}
}
void
clearCamera(Camera *cam, RGBA *col, uint32 mode)
{
RGBAf colf;
GLbitfield mask;
convColor(&colf, col);
glClearColor(colf.red, colf.green, colf.blue, colf.alpha);
mask = 0;
if(mode & Camera::CLEARIMAGE)
mask |= GL_COLOR_BUFFER_BIT;
if(mode & Camera::CLEARZ)
mask |= GL_DEPTH_BUFFER_BIT;
glClear(mask);
}
void
beginUpdate(Camera *cam)
{
@@ -353,12 +395,22 @@ beginUpdate(Camera *cam)
// TODO
}
setProjectionMatrix(proj);
if(uniformState.fogStart != cam->fogPlane){
uniformState.fogStart = cam->fogPlane;
stateDirty = 1;
}
if(uniformState.fogEnd != cam->farPlane){
uniformState.fogEnd = cam->farPlane;
stateDirty = 1;
}
}
void
initializeRender(void)
{
driver[PLATFORM_GL3]->beginUpdate = beginUpdate;
driver[PLATFORM_GL3]->clearCamera = clearCamera;
driver[PLATFORM_GL3]->setRenderState = setRenderState;
driver[PLATFORM_GL3]->getRenderState = getRenderState;

View File

@@ -32,7 +32,7 @@ static void*
matfxOpen(void *o, int32, int32)
{
matFXGlobals.pipelines[PLATFORM_GL3] = makeMatFXPipeline();
envShader = Shader::fromFiles("matfx_env.vert", "simple.frag");
envShader = Shader::fromFiles("matfx_env.vert", "matfx_env.frag");
return o;
}