mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-10 23:02:08 +00:00
- added per pixel lighting for decals.
This commit is contained in:
parent
16e64a19ae
commit
d643a42c4f
4 changed files with 28 additions and 14 deletions
|
@ -47,23 +47,13 @@
|
||||||
|
|
||||||
void HWDecal::DrawDecal(HWDrawInfo *di, FRenderState &state)
|
void HWDecal::DrawDecal(HWDrawInfo *di, FRenderState &state)
|
||||||
{
|
{
|
||||||
// calculate dynamic light effect.
|
|
||||||
if (di->Level->HasDynamicLights && !di->isFullbrightScene() && gl_light_sprites)
|
|
||||||
{
|
|
||||||
// Note: This should be replaced with proper shader based lighting.
|
|
||||||
double x, y;
|
|
||||||
float out[3];
|
|
||||||
decal->GetXY(decal->Side, x, y);
|
|
||||||
di->GetDynSpriteLight(nullptr, x, y, zcenter, decal->Side->lighthead, decal->Side->sector->PortalGroup, out);
|
|
||||||
state.SetDynLight(out[0], out[1], out[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// alpha color only has an effect when using an alpha texture.
|
// alpha color only has an effect when using an alpha texture.
|
||||||
if (decal->RenderStyle.Flags & (STYLEF_RedIsAlpha | STYLEF_ColorIsFixed))
|
if (decal->RenderStyle.Flags & (STYLEF_RedIsAlpha | STYLEF_ColorIsFixed))
|
||||||
{
|
{
|
||||||
state.SetObjectColor(decal->AlphaColor | 0xff000000);
|
state.SetObjectColor(decal->AlphaColor | 0xff000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.SetLightIndex(dynlightindex);
|
||||||
state.SetTextureMode(decal->RenderStyle);
|
state.SetTextureMode(decal->RenderStyle);
|
||||||
state.SetRenderStyle(decal->RenderStyle);
|
state.SetRenderStyle(decal->RenderStyle);
|
||||||
state.SetMaterial(texture, UF_Sprite, 0, CLAMP_XY, decal->Translation, -1);
|
state.SetMaterial(texture, UF_Sprite, 0, CLAMP_XY, decal->Translation, -1);
|
||||||
|
@ -133,7 +123,6 @@ void HWDrawInfo::DrawDecals(FRenderState &state, TArray<HWDecal *> &decals)
|
||||||
side_t *wall = nullptr;
|
side_t *wall = nullptr;
|
||||||
state.SetDepthMask(false);
|
state.SetDepthMask(false);
|
||||||
state.SetDepthBias(-1, -128);
|
state.SetDepthBias(-1, -128);
|
||||||
state.SetLightIndex(-1);
|
|
||||||
for (auto gldecal : decals)
|
for (auto gldecal : decals)
|
||||||
{
|
{
|
||||||
if (gldecal->decal->Side != wall)
|
if (gldecal->decal->Side != wall)
|
||||||
|
@ -167,7 +156,6 @@ void HWWall::DrawDecalsForMirror(HWDrawInfo *di, FRenderState &state, TArray<HWD
|
||||||
{
|
{
|
||||||
state.SetDepthMask(false);
|
state.SetDepthMask(false);
|
||||||
state.SetDepthBias(-1, -128);
|
state.SetDepthBias(-1, -128);
|
||||||
state.SetLightIndex(-1);
|
|
||||||
di->SetFog(state, lightlevel, rellight + getExtraLight(), di->isFullbrightScene(), &Colormap, false);
|
di->SetFog(state, lightlevel, rellight + getExtraLight(), di->isFullbrightScene(), &Colormap, false);
|
||||||
for (auto gldecal : decals)
|
for (auto gldecal : decals)
|
||||||
{
|
{
|
||||||
|
@ -389,11 +377,13 @@ void HWWall::ProcessDecal(HWDrawInfo *di, DBaseDecal *decal, const FVector3 &nor
|
||||||
{
|
{
|
||||||
gldecal->lightlevel = 255;
|
gldecal->lightlevel = 255;
|
||||||
gldecal->rellight = 0;
|
gldecal->rellight = 0;
|
||||||
|
gldecal->dynlightindex = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gldecal->lightlevel = lightlevel;
|
gldecal->lightlevel = lightlevel;
|
||||||
gldecal->rellight = rellight + getExtraLight();
|
gldecal->rellight = rellight + getExtraLight();
|
||||||
|
gldecal->dynlightindex = dynlightindex;
|
||||||
}
|
}
|
||||||
|
|
||||||
gldecal->Colormap = Colormap;
|
gldecal->Colormap = Colormap;
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "hwrenderer/scene/hw_drawinfo.h"
|
#include "hwrenderer/scene/hw_drawinfo.h"
|
||||||
#include "hw_material.h"
|
#include "hw_material.h"
|
||||||
#include "actor.h"
|
#include "actor.h"
|
||||||
|
#include "g_levellocals.h"
|
||||||
|
|
||||||
EXTERN_CVAR(Bool, gl_seamless)
|
EXTERN_CVAR(Bool, gl_seamless)
|
||||||
|
|
||||||
|
@ -81,7 +82,14 @@ void HWDrawInfo::AddMirrorSurface(HWWall *w)
|
||||||
tcs[HWWall::LOLFT].u = tcs[HWWall::LORGT].u = tcs[HWWall::UPLFT].u = tcs[HWWall::UPRGT].u = v.X;
|
tcs[HWWall::LOLFT].u = tcs[HWWall::LORGT].u = tcs[HWWall::UPLFT].u = tcs[HWWall::UPRGT].u = v.X;
|
||||||
tcs[HWWall::LOLFT].v = tcs[HWWall::LORGT].v = tcs[HWWall::UPLFT].v = tcs[HWWall::UPRGT].v = v.Z;
|
tcs[HWWall::LOLFT].v = tcs[HWWall::LORGT].v = tcs[HWWall::UPLFT].v = tcs[HWWall::UPRGT].v = v.Z;
|
||||||
newwall->MakeVertices(this, false);
|
newwall->MakeVertices(this, false);
|
||||||
|
|
||||||
|
bool hasDecals = newwall->seg->sidedef && newwall->seg->sidedef->AttachedDecals;
|
||||||
|
if (hasDecals && Level->HasDynamicLights && !isFullbrightScene())
|
||||||
|
{
|
||||||
|
newwall->SetupLights(this, lightdata);
|
||||||
|
}
|
||||||
newwall->ProcessDecals(this);
|
newwall->ProcessDecals(this);
|
||||||
|
newwall->dynlightindex = -1; // the environment map should not be affected by lights - only the decals.
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
|
@ -414,6 +414,7 @@ struct HWDecal
|
||||||
int rellight;
|
int rellight;
|
||||||
float alpha;
|
float alpha;
|
||||||
FColormap Colormap;
|
FColormap Colormap;
|
||||||
|
int dynlightindex;
|
||||||
sector_t *frontsector;
|
sector_t *frontsector;
|
||||||
FVector3 Normal;
|
FVector3 Normal;
|
||||||
|
|
||||||
|
|
|
@ -504,11 +504,26 @@ void HWWall::PutWall(HWDrawInfo *di, bool translucent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool solid;
|
bool solid;
|
||||||
if (passflag[type] == 1) solid = true;
|
if (passflag[type] == 1) solid = true;
|
||||||
else if (type == RENDERWALL_FFBLOCK) solid = texture && !texture->isMasked();
|
else if (type == RENDERWALL_FFBLOCK) solid = texture && !texture->isMasked();
|
||||||
else solid = false;
|
else solid = false;
|
||||||
if (solid) ProcessDecals(di);
|
|
||||||
|
bool hasDecals = solid && seg->sidedef && seg->sidedef->AttachedDecals;
|
||||||
|
if (hasDecals)
|
||||||
|
{
|
||||||
|
// If we want to use the light infos for the decal we cannot delay the creation until the render pass.
|
||||||
|
if (screen->BuffersArePersistent())
|
||||||
|
{
|
||||||
|
if (di->Level->HasDynamicLights && !di->isFullbrightScene() && texture != nullptr)
|
||||||
|
{
|
||||||
|
SetupLights(di, lightdata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ProcessDecals(di);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
di->AddWall(this);
|
di->AddWall(this);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue