mirror of https://github.com/aap/librw.git
implemented fog for gl3
This commit is contained in:
parent
abe0bba5af
commit
dcbbdfe6b2
|
@ -124,6 +124,12 @@ Camera::destroy(void)
|
|||
free(this);
|
||||
}
|
||||
|
||||
void
|
||||
Camera::clear(RGBA *col, uint32 mode)
|
||||
{
|
||||
DRIVER->clearCamera(this, col, mode);
|
||||
}
|
||||
|
||||
struct CameraChunkData
|
||||
{
|
||||
V2d viewWindow;
|
||||
|
|
|
@ -230,7 +230,7 @@ beginUpdate(Camera *cam)
|
|||
|
||||
proj[12] = 0.0f;
|
||||
proj[13] = 0.0f;
|
||||
proj[14] = -this->nearPlane*this->projMat[10];
|
||||
proj[14] = -this->nearPlane*proj[10];
|
||||
proj[15] = 0.0f;
|
||||
}else{
|
||||
proj[8] = 0.0f;
|
||||
|
@ -240,7 +240,7 @@ beginUpdate(Camera *cam)
|
|||
|
||||
proj[12] = this->viewOffset.x*invwx;
|
||||
proj[13] = this->viewOffset.y*invwy;
|
||||
proj[14] = -this->nearPlane*this->projMat[10];
|
||||
proj[14] = -this->nearPlane*proj[10];
|
||||
proj[15] = 1.0f;
|
||||
}
|
||||
device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)proj);
|
||||
|
|
|
@ -69,8 +69,8 @@ Driver::open(void)
|
|||
namespace null {
|
||||
|
||||
void beginUpdate(Camera*) { }
|
||||
|
||||
void endUpdate(Camera*) { }
|
||||
void clearCamera(Camera*,RGBA*,uint32) { }
|
||||
|
||||
void setRenderState(int32, uint32) { }
|
||||
uint32 getRenderState(int32) { return 0; }
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,8 +7,10 @@ enum RenderState
|
|||
DESTBLEND,
|
||||
ZTESTENABLE,
|
||||
ZWRITEENABLE,
|
||||
FOGENABLE,
|
||||
FOGCOLOR,
|
||||
// TODO:
|
||||
// fog enable, color, type, density
|
||||
// fog type, density ?
|
||||
// ? cullmode
|
||||
// ? shademode
|
||||
// ???? stencil
|
||||
|
@ -16,7 +18,6 @@ enum RenderState
|
|||
// platform specific or opaque?
|
||||
ALPHATESTFUNC,
|
||||
ALPHATESTREF,
|
||||
ZTESTFUNC,
|
||||
};
|
||||
|
||||
enum AlphaTestFunc
|
||||
|
@ -42,10 +43,6 @@ enum BlendFunction
|
|||
// TODO: add more perhaps
|
||||
};
|
||||
|
||||
enum ZTestFunc
|
||||
{
|
||||
};
|
||||
|
||||
// This is for platform independent things
|
||||
// TODO: move more stuff into this
|
||||
struct Engine
|
||||
|
@ -66,6 +63,7 @@ struct Driver
|
|||
|
||||
void (*beginUpdate)(Camera*);
|
||||
void (*endUpdate)(Camera*);
|
||||
void (*clearCamera)(Camera*, RGBA *col, uint32 mode);
|
||||
|
||||
void (*setRenderState)(int32 state, uint32 value);
|
||||
uint32 (*getRenderState)(int32 state);
|
||||
|
@ -97,6 +95,7 @@ inline uint32 getRenderState(int32 state){
|
|||
namespace null {
|
||||
void beginUpdate(Camera*);
|
||||
void endUpdate(Camera*);
|
||||
void clearCamera(Camera*, RGBA *col, uint32 mode);
|
||||
|
||||
void setRenderState(int32 state, uint32 value);
|
||||
uint32 getRenderState(int32 state);
|
||||
|
|
|
@ -524,6 +524,7 @@ struct Camera : PluginBase<Camera>
|
|||
{
|
||||
enum { ID = 4 };
|
||||
enum { PERSPECTIVE = 1, PARALLEL };
|
||||
enum { CLEARIMAGE = 0x1, CLEARZ = 0x2};
|
||||
|
||||
ObjectWithFrame object;
|
||||
void (*beginUpdateCB)(Camera*);
|
||||
|
@ -533,8 +534,6 @@ struct Camera : PluginBase<Camera>
|
|||
float32 nearPlane, farPlane;
|
||||
float32 fogPlane;
|
||||
int32 projection;
|
||||
// TODO: remove this?
|
||||
float32 projMat[16];
|
||||
|
||||
// clump link handled by plugin in RW
|
||||
Clump *clump;
|
||||
|
@ -556,6 +555,7 @@ struct Camera : PluginBase<Camera>
|
|||
return LLLinkGetData(lnk, Camera, inClump); }
|
||||
void beginUpdate(void) { this->beginUpdateCB(this); }
|
||||
void endUpdate(void) { this->endUpdateCB(this); }
|
||||
void clear(RGBA *col, uint32 mode);
|
||||
static Camera *streamRead(Stream *stream);
|
||||
bool streamWrite(Stream *stream);
|
||||
uint32 streamGetSize(void);
|
||||
|
|
Loading…
Reference in New Issue