mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2025-02-02 03:11:22 +00:00
Calculate sprite dynamic light contribution and pass it along to the sprite drawer
This commit is contained in:
parent
5ef8ecce2a
commit
eac98ac226
3 changed files with 57 additions and 0 deletions
|
@ -56,6 +56,7 @@
|
||||||
#include "swrenderer/viewport/r_viewport.h"
|
#include "swrenderer/viewport/r_viewport.h"
|
||||||
#include "swrenderer/r_memory.h"
|
#include "swrenderer/r_memory.h"
|
||||||
#include "swrenderer/r_renderthread.h"
|
#include "swrenderer/r_renderthread.h"
|
||||||
|
#include "gl/dynlights/gl_dynlight.h"
|
||||||
|
|
||||||
EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor)
|
EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor)
|
||||||
|
|
||||||
|
@ -225,6 +226,54 @@ namespace swrenderer
|
||||||
|
|
||||||
bool fullbright = !vis->foggy && ((renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
bool fullbright = !vis->foggy && ((renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
||||||
bool fadeToBlack = (vis->RenderStyle.Flags & STYLEF_FadeToBlack) != 0;
|
bool fadeToBlack = (vis->RenderStyle.Flags & STYLEF_FadeToBlack) != 0;
|
||||||
|
|
||||||
|
if (r_dynlights)
|
||||||
|
{
|
||||||
|
float lit_red = 0;
|
||||||
|
float lit_green = 0;
|
||||||
|
float lit_blue = 0;
|
||||||
|
auto node = vis->sector->lighthead;
|
||||||
|
while (node != nullptr)
|
||||||
|
{
|
||||||
|
ADynamicLight *light = node->lightsource;
|
||||||
|
if (light->visibletoplayer && !(light->flags2&MF2_DORMANT) && (!(light->flags4&MF4_DONTLIGHTSELF) || light->target != thing))
|
||||||
|
{
|
||||||
|
double lightX = light->X() - ViewPos.X;
|
||||||
|
double lightY = light->Y() - ViewPos.Y;
|
||||||
|
double lightZ = light->Z() - ViewPos.Z;
|
||||||
|
|
||||||
|
float lx = (float)(lightX * ViewSin - lightY * ViewCos) - pos.X;
|
||||||
|
float ly = (float)(lightX * ViewTanCos + lightY * ViewTanSin) - pos.Y;
|
||||||
|
float lz = (float)lightZ - pos.Z;
|
||||||
|
|
||||||
|
bool is_point_light = (node->lightsource->flags4 & MF4_ATTENUATE) != 0;
|
||||||
|
float LdotL = lx * lx + ly * ly + lz * lz;
|
||||||
|
float NdotL = is_point_light ? -ly : 0.0f;
|
||||||
|
|
||||||
|
float radius = node->lightsource->GetRadius();
|
||||||
|
if (radius * radius >= LdotL && NdotL > 0.0f)
|
||||||
|
{
|
||||||
|
uint32_t red = light->GetRed();
|
||||||
|
uint32_t green = light->GetGreen();
|
||||||
|
uint32_t blue = light->GetBlue();
|
||||||
|
float distance = sqrt(LdotL);
|
||||||
|
float attenuation = distance / radius * NdotL;
|
||||||
|
lit_red += red * attenuation;
|
||||||
|
lit_red += green * attenuation;
|
||||||
|
lit_red += blue * attenuation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node = node->nextLight;
|
||||||
|
}
|
||||||
|
lit_red = MIN(lit_red, 255.0f);
|
||||||
|
lit_green = MIN(lit_green, 255.0f);
|
||||||
|
lit_blue = MIN(lit_blue, 255.0f);
|
||||||
|
vis->dynlightcolor = (((uint32_t)lit_red) << 16) | (((uint32_t)lit_green) << 8) | ((uint32_t)lit_blue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vis->dynlightcolor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
vis->Light.SetColormap(LightVisibility::Instance()->SpriteGlobVis() / MAX(tz, MINZ), spriteshade, basecolormap, fullbright, invertcolormap, fadeToBlack);
|
vis->Light.SetColormap(LightVisibility::Instance()->SpriteGlobVis() / MAX(tz, MINZ), spriteshade, basecolormap, fullbright, invertcolormap, fadeToBlack);
|
||||||
|
|
||||||
|
@ -250,6 +299,7 @@ namespace swrenderer
|
||||||
|
|
||||||
SpriteDrawerArgs drawerargs;
|
SpriteDrawerArgs drawerargs;
|
||||||
drawerargs.SetLight(vis->Light.BaseColormap, 0, vis->Light.ColormapNum << FRACBITS);
|
drawerargs.SetLight(vis->Light.BaseColormap, 0, vis->Light.ColormapNum << FRACBITS);
|
||||||
|
drawerargs.SetDynamicLight(dynlightcolor);
|
||||||
|
|
||||||
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(vis->Light.BaseColormap);
|
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(vis->Light.BaseColormap);
|
||||||
|
|
||||||
|
|
|
@ -32,5 +32,7 @@ namespace swrenderer
|
||||||
|
|
||||||
uint32_t Translation = 0;
|
uint32_t Translation = 0;
|
||||||
uint32_t FillColor = 0;
|
uint32_t FillColor = 0;
|
||||||
|
|
||||||
|
uint32_t dynlightcolor = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace swrenderer
|
||||||
void SetDest(int x, int y);
|
void SetDest(int x, int y);
|
||||||
void SetCount(int count) { dc_count = count; }
|
void SetCount(int count) { dc_count = count; }
|
||||||
void SetSolidColor(int color) { dc_color = color; }
|
void SetSolidColor(int color) { dc_color = color; }
|
||||||
|
void SetDynamicLight(uint32_t color) { dynlightcolor = color; }
|
||||||
|
|
||||||
void DrawMaskedColumn(RenderThread *thread, int x, fixed_t iscale, FTexture *texture, fixed_t column, double spryscale, double sprtopscreen, bool sprflipvert, const short *mfloorclip, const short *mceilingclip, bool unmasked = false);
|
void DrawMaskedColumn(RenderThread *thread, int x, fixed_t iscale, FTexture *texture, fixed_t column, double spryscale, double sprtopscreen, bool sprflipvert, const short *mfloorclip, const short *mceilingclip, bool unmasked = false);
|
||||||
void FillColumn(RenderThread *thread);
|
void FillColumn(RenderThread *thread);
|
||||||
|
@ -50,6 +51,8 @@ namespace swrenderer
|
||||||
uint32_t *DestBlend() const { return dc_destblend; }
|
uint32_t *DestBlend() const { return dc_destblend; }
|
||||||
fixed_t SrcAlpha() const { return dc_srcalpha; }
|
fixed_t SrcAlpha() const { return dc_srcalpha; }
|
||||||
fixed_t DestAlpha() const { return dc_destalpha; }
|
fixed_t DestAlpha() const { return dc_destalpha; }
|
||||||
|
|
||||||
|
uint32_t DynamicLight() const { return dynlightcolor; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool SetBlendFunc(int op, fixed_t fglevel, fixed_t bglevel, int flags);
|
bool SetBlendFunc(int op, fixed_t fglevel, fixed_t bglevel, int flags);
|
||||||
|
@ -81,6 +84,8 @@ namespace swrenderer
|
||||||
int dc_color = 0;
|
int dc_color = 0;
|
||||||
uint32_t dc_srccolor = 0;
|
uint32_t dc_srccolor = 0;
|
||||||
uint32_t dc_srccolor_bgra = 0;
|
uint32_t dc_srccolor_bgra = 0;
|
||||||
|
|
||||||
|
uint32_t dynlightcolor = 0;
|
||||||
|
|
||||||
typedef void(SWPixelFormatDrawers::*SpriteDrawerFunc)(const SpriteDrawerArgs &args);
|
typedef void(SWPixelFormatDrawers::*SpriteDrawerFunc)(const SpriteDrawerArgs &args);
|
||||||
SpriteDrawerFunc colfunc;
|
SpriteDrawerFunc colfunc;
|
||||||
|
|
Loading…
Reference in a new issue