diff --git a/src/common/rendering/hwrenderer/data/hw_cvars.cpp b/src/common/rendering/hwrenderer/data/hw_cvars.cpp index 93fbfec3a..d59a5c151 100644 --- a/src/common/rendering/hwrenderer/data/hw_cvars.cpp +++ b/src/common/rendering/hwrenderer/data/hw_cvars.cpp @@ -178,4 +178,6 @@ CUSTOM_CVAR(Int, gl_spritelight, -1, CVAR_GLOBALCONFIG | CVAR_ARCHIVE) int get_gl_spritelight() { return gl_spritelight < 0 ? (screen->IsRayQueryEnabled() ? 1 : 0) : gl_spritelight; -} \ No newline at end of file +} + +CVAR(Bool, gl_fakemodellight, true, CVAR_GLOBALCONFIG | CVAR_ARCHIVE) diff --git a/src/common/rendering/hwrenderer/data/hw_cvars.h b/src/common/rendering/hwrenderer/data/hw_cvars.h index db43bb828..65e8c3dcc 100644 --- a/src/common/rendering/hwrenderer/data/hw_cvars.h +++ b/src/common/rendering/hwrenderer/data/hw_cvars.h @@ -63,4 +63,6 @@ EXTERN_CVAR(Bool, gl_strict_gldefs) EXTERN_CVAR(Int, gl_wireframe) EXTERN_CVAR(Color, gl_wireframecolor) -int get_gl_spritelight(); \ No newline at end of file +int get_gl_spritelight(); + +EXTERN_CVAR(Bool, gl_fakemodellight) diff --git a/src/rendering/hwrenderer/hw_dynlightdata.cpp b/src/rendering/hwrenderer/hw_dynlightdata.cpp index 0f1d5db9f..86f4de1b0 100644 --- a/src/rendering/hwrenderer/hw_dynlightdata.cpp +++ b/src/rendering/hwrenderer/hw_dynlightdata.cpp @@ -176,7 +176,7 @@ void AddSunLightToList(FDynLightData& dld, float x, float y, float z, const FVec info.r = suncolor.X; info.g = suncolor.Y; info.b = suncolor.Z; - info.flags = LIGHTINFO_ATTENUATED | (doTrace ? LIGHTINFO_TRACE : 0) | LIGHTINFO_SUN; + info.flags = LIGHTINFO_ATTENUATED | (doTrace ? (LIGHTINFO_TRACE | LIGHTINFO_SUN) : 0); info.strength = 1500.0f; dld.arrays[LIGHTARRAY_NORMAL].Push(info); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index 92d17ff95..1fe3a6386 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -316,7 +316,7 @@ public: void GetDynSpriteLight(AActor *self, sun_trace_cache_t * traceCache, double x, double y, double z, FLightNode *node, int portalgroup, float *out, bool fullbright); void GetDynSpriteLight(AActor *thing, particle_t *particle, sun_trace_cache_t * traceCache, float *out); - void GetDynSpriteLightList(AActor *self, FDynLightData &modellightdata); + void GetDynSpriteLightList(AActor *self, FDynLightData &modellightdata, bool isModel); void PreparePlayerSprites(sector_t * viewsector, area_t in_area, FRenderState& state); void PrepareTargeterSprites(double ticfrac, FRenderState& state); diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index 116bdde0f..89b0f82d2 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -258,7 +258,7 @@ void HWDrawInfo::GetDynSpriteLight(AActor *thing, particle_t *particle, sun_trac } -void HWDrawInfo::GetDynSpriteLightList(AActor *self, FDynLightData &modellightdata) +void HWDrawInfo::GetDynSpriteLightList(AActor *self, FDynLightData &modellightdata, bool isModel) { modellightdata.Clear(); @@ -282,6 +282,12 @@ void HWDrawInfo::GetDynSpriteLightList(AActor *self, FDynLightData &modellightda int gl_spritelight = get_gl_spritelight(); + if(isModel && gl_fakemodellight) + { + //fake light for contrast + AddSunLightToList(modellightdata, x, y, z, FVector3(self->Level->SunDirection.X + 180, 45, 0), self->Level->SunColor * self->Level->SunIntensity * 0.05, false); + } + if ((level.lightmaps && gl_spritelight > 0) || ActorTraceStaticLight::TraceSunVisibility(x, y, z, (self ? &self->StaticLightsTraceCache : nullptr), (self ? staticLight.ActorMoved : false))) { AddSunLightToList(modellightdata, x, y, z, self->Level->SunDirection, self->Level->SunColor * self->Level->SunIntensity, gl_spritelight > 0); diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index d5844b952..8c715ac84 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -654,7 +654,7 @@ inline void HWSprite::PutSprite(HWDrawInfo *di, FRenderState& state, bool transl // That's a lot of checks... if ((get_gl_spritelight() > 0 || (modelframe && !modelframe->isVoxel && !(modelframeflags & MDL_NOPERPIXELLIGHTING))) && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) { - di->GetDynSpriteLightList(actor, lightdata); + di->GetDynSpriteLightList(actor, lightdata, modelframe && !modelframe->isVoxel); dynlightindex = state.UploadLights(lightdata); } else diff --git a/src/rendering/hwrenderer/scene/hw_weapon.cpp b/src/rendering/hwrenderer/scene/hw_weapon.cpp index c814191aa..495177355 100644 --- a/src/rendering/hwrenderer/scene/hw_weapon.cpp +++ b/src/rendering/hwrenderer/scene/hw_weapon.cpp @@ -844,7 +844,7 @@ void HWDrawInfo::PreparePlayerSprites3D(sector_t * viewsector, area_t in_area, F // set the lighting parameters if (hudsprite.RenderStyle.BlendOp != STYLEOP_Shadow && Level->HasDynamicLights && !isFullbrightScene() && gl_light_sprites) { - GetDynSpriteLightList(playermo, lightdata); + GetDynSpriteLightList(playermo, lightdata, true); hudsprite.lightindex = state.UploadLights(lightdata); }