diff --git a/src/gl/compatibility/gl_20.cpp b/src/gl/compatibility/gl_20.cpp index c9a615c0c9..de9a957a88 100644 --- a/src/gl/compatibility/gl_20.cpp +++ b/src/gl/compatibility/gl_20.cpp @@ -41,7 +41,6 @@ #include "actorinlines.h" #include "g_levellocals.h" #include "gl/dynlights/gl_dynlight.h" -#include "gl/utility/gl_geometric.h" #include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_lightdata.h" #include "gl/system/gl_interface.h" @@ -641,7 +640,7 @@ void GLFlat::DrawSubsectorLights(subsector_t * sub, int pass) continue; } - p.Set(plane.plane); + p.Set(plane.plane.Normal(), plane.plane.fD()); if (!gl_SetupLight(sub->sector->PortalGroup, p, light, nearPt, up, right, scale, false, pass != GLPASS_LIGHTTEX)) { node = node->nextLight; @@ -715,7 +714,8 @@ bool GLWall::PrepareLight(ADynamicLight * light, int pass) FVector3 nearPt, up, right; float scale; - p.Set(&glseg); + auto normal = glseg.Normal(); + p.Set(normal, -normal.X * glseg.x1 - normal.Y * glseg.y1); if (!p.ValidNormal()) { diff --git a/src/gl/dynlights/gl_dynlight.h b/src/gl/dynlights/gl_dynlight.h index 1ecdca4ce7..99979f034a 100644 --- a/src/gl/dynlights/gl_dynlight.h +++ b/src/gl/dynlights/gl_dynlight.h @@ -25,7 +25,6 @@ #include "c_cvars.h" #include "a_dynlight.h" -#include "gl/utility/gl_geometric.h" struct FDynLightData diff --git a/src/gl/gl_functions.h b/src/gl/gl_functions.h index 2401926fff..620533f1e7 100644 --- a/src/gl/gl_functions.h +++ b/src/gl/gl_functions.h @@ -7,6 +7,5 @@ class AActor; void gl_PreprocessLevel(); void gl_CleanLevelData(); -void gl_LinkLights(); #endif diff --git a/src/gl/scene/gl_flats.cpp b/src/gl/scene/gl_flats.cpp index 7413c895ac..b70f6cdfe7 100644 --- a/src/gl/scene/gl_flats.cpp +++ b/src/gl/scene/gl_flats.cpp @@ -141,7 +141,7 @@ void GLFlat::SetupSubsectorLights(int pass, subsector_t * sub, int *dli) continue; } - p.Set(plane.plane); + p.Set(plane.plane.Normal(), plane.plane.fD()); gl_GetLight(sub->sector->PortalGroup, p, light, false, lightdata); node = node->nextLight; } diff --git a/src/gl/scene/gl_walls_draw.cpp b/src/gl/scene/gl_walls_draw.cpp index 17164bc496..1795f17691 100644 --- a/src/gl/scene/gl_walls_draw.cpp +++ b/src/gl/scene/gl_walls_draw.cpp @@ -74,14 +74,10 @@ void GLWall::SetupLights() Plane p; lightdata.Clear(); - p.Set(&glseg); - /* - if (!p.ValidNormal()) - { - return; - } - */ + auto normal = glseg.Normal(); + p.Set(normal, -normal.X * glseg.x1 - normal.Y * glseg.y1); + FLightNode *node; if (seg->sidedef == NULL) { diff --git a/src/gl/utility/gl_geometric.h b/src/gl/utility/gl_geometric.h deleted file mode 100644 index 5f5fad8e51..0000000000 --- a/src/gl/utility/gl_geometric.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -** gl_geometric.h -** -**--------------------------------------------------------------------------- -** Copyright 2003 Timothy Stump -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -#ifndef __GL_GEOM -#define __GL_GEOM - -#include "math.h" -#include "r_defs.h" -#include "gl/scene/gl_wall.h" - -struct GLSeg; - -class Plane -{ -public: - void Set(GLSeg *seg) - { - m_normal = seg->Normal(); - m_d = m_normal | FVector3(-seg->x1, 0, -seg->y1); - } - - void Set(secplane_t &plane) - { - m_normal = { (float)plane.Normal().X, (float)plane.Normal().Z, (float)plane.Normal().Y }; - m_d = (float)plane.fD(); - } - - - float DistToPoint(float x, float y, float z) - { - FVector3 p(x, y, z); - - return (m_normal | p) + m_d; - } - - - bool PointOnSide(float x, float y, float z) - { - return DistToPoint(x, y, z) < 0.f; - } - - bool PointOnSide(FVector3 &v) { return PointOnSide(v.X, v.Y, v.Z); } - bool ValidNormal() { return m_normal.LengthSquared() == 1.f; } - - float A() { return m_normal.X; } - float B() { return m_normal.Y; } - float C() { return m_normal.Z; } - float D() { return m_d; } - - const FVector3 &Normal() const { return m_normal; } -protected: - FVector3 m_normal; - float m_d; -}; - -#endif diff --git a/src/vectors.h b/src/vectors.h index 95d7c5fdf7..1d5e32307d 100644 --- a/src/vectors.h +++ b/src/vectors.h @@ -1673,4 +1673,48 @@ typedef TRotator DRotator; typedef TMatrix3x3 DMatrix3x3; typedef TAngle DAngle; + +class Plane +{ +public: + void Set(FVector3 normal, float d) + { + m_normal = normal; + m_d = d; + } + + // same for a play-vector. Note that y and z are inversed. + void Set(DVector3 normal, double d) + { + m_normal = { (float)normal.X, (float)normal.Z, (float)normal.Y }; + m_d = (float)d; + } + + float DistToPoint(float x, float y, float z) + { + FVector3 p(x, y, z); + + return (m_normal | p) + m_d; + } + + + bool PointOnSide(float x, float y, float z) + { + return DistToPoint(x, y, z) < 0.f; + } + + bool PointOnSide(FVector3 &v) { return PointOnSide(v.X, v.Y, v.Z); } + bool ValidNormal() { return m_normal.LengthSquared() == 1.f; } + + float A() { return m_normal.X; } + float B() { return m_normal.Y; } + float C() { return m_normal.Z; } + float D() { return m_d; } + + const FVector3 &Normal() const { return m_normal; } +protected: + FVector3 m_normal; + float m_d; +}; + #endif