fixed ztest on d3d9; texture refcounting in matfx

This commit is contained in:
aap 2020-04-16 18:40:11 +02:00
parent eb49dd007c
commit 7cea137baf
2 changed files with 47 additions and 11 deletions

View File

@ -246,6 +246,36 @@ resetD3d9Device(void)
// RW render state
static void
setDepthTest(bool32 enable)
{
if(rwStateCache.ztest != enable){
rwStateCache.ztest = enable;
if(rwStateCache.zwrite && !enable){
// If we still want to write, enable but set mode to always
setRenderState(D3DRS_ZENABLE, TRUE);
setRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
}else{
setRenderState(D3DRS_ZENABLE, rwStateCache.ztest);
setRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
}
}
}
static void
setDepthWrite(bool32 enable)
{
if(rwStateCache.zwrite != enable){
rwStateCache.zwrite = enable;
if(enable && !rwStateCache.ztest){
// Have to switch on ztest so writing can work
setRenderState(D3DRS_ZENABLE, TRUE);
setRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
}
setRenderState(D3DRS_ZWRITEENABLE, rwStateCache.zwrite);
}
}
static void
setVertexAlpha(bool32 enable)
{
@ -415,16 +445,10 @@ setRwRenderState(int32 state, void *pvalue)
}
break;
case ZTESTENABLE:
if(rwStateCache.ztest != bval){
rwStateCache.ztest = bval;
setRenderState(D3DRS_ZENABLE, rwStateCache.ztest);
}
setDepthTest(bval);
break;
case ZWRITEENABLE:
if(rwStateCache.zwrite != bval){
rwStateCache.zwrite = bval;
setRenderState(D3DRS_ZWRITEENABLE, rwStateCache.zwrite);
}
setDepthWrite(bval);
break;
case FOGENABLE:
if(rwStateCache.fogenable != bval){

View File

@ -159,8 +159,12 @@ void
MatFX::setBumpTexture(Texture *t)
{
int32 i = this->getEffectIndex(BUMPMAP);
if(i >= 0)
if(i >= 0){
if(this->fx[i].bump.tex)
this->fx[i].bump.tex->destroy();
this->fx[i].bump.tex = t;
t->refCount++;
}
}
void
@ -193,8 +197,12 @@ void
MatFX::setEnvTexture(Texture *t)
{
int32 i = this->getEffectIndex(ENVMAP);
if(i >= 0)
if(i >= 0){
if(this->fx[i].env.tex)
this->fx[i].env.tex->destroy();
this->fx[i].env.tex = t;
t->refCount++;
}
}
void
@ -245,8 +253,12 @@ void
MatFX::setDualTexture(Texture *t)
{
int32 i = this->getEffectIndex(DUAL);
if(i >= 0)
if(i >= 0){
if(this->fx[i].dual.tex)
this->fx[i].dual.tex->destroy();
this->fx[i].dual.tex = t;
t->refCount++;
}
}
void