mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-12-16 07:21:28 +00:00
8b6e09ca09
This was done to clean up the license and to ensure that any commercial fork of the engine has to obey the far stricter requirements concerning source distribution. The old license was compatible with GPLv2 whereas combining GPLv2 and LGPLv3 force a license upgrade to GPLv3. The license of code that originates from ZDoomGL has not been changed.
129 lines
3.9 KiB
C++
129 lines
3.9 KiB
C++
//
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Copyright(C) 2002-2016 Christoph Oelckers
|
|
// All rights reserved.
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with this program. If not, see http://www.gnu.org/licenses/
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
//
|
|
/*
|
|
** gl_light.cpp
|
|
** Light level / fog management / dynamic lights
|
|
**
|
|
*/
|
|
|
|
#include "gl/system/gl_system.h"
|
|
#include "c_dispatch.h"
|
|
#include "p_local.h"
|
|
#include "p_effect.h"
|
|
#include "vectors.h"
|
|
#include "gl/gl_functions.h"
|
|
#include "g_level.h"
|
|
|
|
#include "gl/system/gl_cvars.h"
|
|
#include "gl/renderer/gl_renderer.h"
|
|
#include "gl/renderer/gl_lightdata.h"
|
|
#include "gl/data/gl_data.h"
|
|
#include "gl/dynlights/gl_dynlight.h"
|
|
#include "gl/scene/gl_drawinfo.h"
|
|
#include "gl/scene/gl_portal.h"
|
|
#include "gl/shaders/gl_shader.h"
|
|
#include "gl/textures/gl_material.h"
|
|
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sets a single light value from all dynamic lights affecting the specified location
|
|
//
|
|
//==========================================================================
|
|
|
|
void gl_SetDynSpriteLight(AActor *self, float x, float y, float z, subsector_t * subsec)
|
|
{
|
|
ADynamicLight *light;
|
|
float frac, lr, lg, lb;
|
|
float radius;
|
|
float out[3] = { 0.0f, 0.0f, 0.0f };
|
|
|
|
// Go through both light lists
|
|
FLightNode * node = subsec->lighthead;
|
|
while (node)
|
|
{
|
|
light=node->lightsource;
|
|
if (light->visibletoplayer && !(light->flags2&MF2_DORMANT) && (!(light->flags4&MF4_DONTLIGHTSELF) || light->target != self))
|
|
{
|
|
float dist;
|
|
|
|
// This is a performance critical section of code where we cannot afford to let the compiler decide whether to inline the function or not.
|
|
// This will do the calculations explicitly rather than calling one of AActor's utility functions.
|
|
if (Displacements.size > 0)
|
|
{
|
|
int fromgroup = light->Sector->PortalGroup;
|
|
int togroup = subsec->sector->PortalGroup;
|
|
if (fromgroup == togroup || fromgroup == 0 || togroup == 0) goto direct;
|
|
|
|
DVector2 offset = Displacements.getOffset(fromgroup, togroup);
|
|
dist = FVector3(x - light->X() - offset.X, y - light->Y() - offset.Y, z - light->Z()).LengthSquared();
|
|
}
|
|
else
|
|
{
|
|
direct:
|
|
dist = FVector3(x - light->X(), y - light->Y(), z - light->Z()).LengthSquared();
|
|
}
|
|
|
|
radius = light->GetRadius();
|
|
|
|
if (dist < radius * radius)
|
|
{
|
|
dist = sqrtf(dist); // only calculate the square root if we really need it.
|
|
|
|
frac = 1.0f - (dist / radius);
|
|
|
|
if (frac > 0)
|
|
{
|
|
lr = light->GetRed() / 255.0f;
|
|
lg = light->GetGreen() / 255.0f;
|
|
lb = light->GetBlue() / 255.0f;
|
|
if (light->IsSubtractive())
|
|
{
|
|
float bright = FVector3(lr, lg, lb).Length();
|
|
FVector3 lightColor(lr, lg, lb);
|
|
lr = (bright - lr) * -1;
|
|
lg = (bright - lg) * -1;
|
|
lb = (bright - lb) * -1;
|
|
}
|
|
|
|
out[0] += lr * frac;
|
|
out[1] += lg * frac;
|
|
out[2] += lb * frac;
|
|
}
|
|
}
|
|
}
|
|
node = node->nextLight;
|
|
}
|
|
gl_RenderState.SetDynLight(out[0], out[1], out[2]);
|
|
}
|
|
|
|
void gl_SetDynSpriteLight(AActor *thing, particle_t *particle)
|
|
{
|
|
if (thing != NULL)
|
|
{
|
|
gl_SetDynSpriteLight(thing, thing->X(), thing->Y(), thing->Center(), thing->subsector);
|
|
}
|
|
else if (particle != NULL)
|
|
{
|
|
gl_SetDynSpriteLight(NULL, particle->Pos.X, particle->Pos.Y, particle->Pos.Z, particle->subsector);
|
|
}
|
|
}
|