diff --git a/CMakeLists.txt b/CMakeLists.txt index 305d643..e4db9c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,6 @@ set( SOURCES src/lightmap/lightmap.cpp src/lightmap/lightsurface.cpp src/lightmap/surfaces.cpp - src/lightmap/trace.cpp src/lightmap/worker.cpp src/lightmap/collision.cpp src/math/angle.cpp @@ -183,7 +182,6 @@ set( HEADERS src/lightmap/lightmap.h src/lightmap/lightsurface.h src/lightmap/surfaces.h - src/lightmap/trace.h src/lightmap/worker.h src/lightmap/collision.h src/math/mathlib.h diff --git a/src/level/doomdata.h b/src/level/doomdata.h index 4172ccf..5428324 100644 --- a/src/level/doomdata.h +++ b/src/level/doomdata.h @@ -305,6 +305,14 @@ enum mapFlags_t #define NO_SIDE_INDEX -1 #define NO_LINE_INDEX 0xffffffff +struct LevelTraceHit +{ + kexVec3 start; + kexVec3 end; + surface_t *hitSurface; + float fraction; +}; + struct FLevel { FLevel (); @@ -362,6 +370,8 @@ struct FLevel void CreateLights(); void CleanupThingLights(); + LevelTraceHit Trace(const kexVec3 &startVec, const kexVec3 &endVec); + const kexVec3 &GetSunColor() const; const kexVec3 &GetSunDirection() const; IntSector *GetFrontSector(const IntSideDef *side); diff --git a/src/level/level_light.cpp b/src/level/level_light.cpp index f0cf5f7..ed3977c 100644 --- a/src/level/level_light.cpp +++ b/src/level/level_light.cpp @@ -368,3 +368,15 @@ void FLevel::CleanupThingLights() delete thingLights[i]; } } + +LevelTraceHit FLevel::Trace(const kexVec3 &startVec, const kexVec3 &endVec) +{ + TraceHit hit = TriangleMeshShape::find_first_hit(CollisionMesh.get(), startVec, endVec); + + LevelTraceHit trace; + trace.start = startVec; + trace.end = endVec; + trace.fraction = hit.fraction; + trace.hitSurface = (trace.fraction < 1.0f) ? surfaces[hit.surface] : nullptr; + return trace; +} diff --git a/src/lightmap/lightmap.cpp b/src/lightmap/lightmap.cpp index 5c38c03..1762046 100644 --- a/src/lightmap/lightmap.cpp +++ b/src/lightmap/lightmap.cpp @@ -32,7 +32,6 @@ #include "math/mathlib.h" #include "surfaces.h" -#include "trace.h" #include "level/level.h" #include "lightmap.h" #include "lightsurface.h" @@ -174,7 +173,7 @@ kexBBox kexLightmapBuilder::GetBoundsFromSurface(const surface_t *surface) } // Traces to the ceiling surface. Will emit light if the surface that was traced is a sky -bool kexLightmapBuilder::EmitFromCeiling(kexTrace &trace, const surface_t *surface, const kexVec3 &origin, const kexVec3 &normal, kexVec3 &color) +bool kexLightmapBuilder::EmitFromCeiling(const surface_t *surface, const kexVec3 &origin, const kexVec3 &normal, kexVec3 &color) { float attenuation = normal.Dot(map->GetSunDirection()); @@ -184,7 +183,7 @@ bool kexLightmapBuilder::EmitFromCeiling(kexTrace &trace, const surface_t *surfa return false; } - trace.Trace(origin, origin + (map->GetSunDirection() * 32768.0f)); + LevelTraceHit trace = map->Trace(origin, origin + (map->GetSunDirection() * 32768.0f)); if (trace.fraction == 1.0f) { @@ -220,7 +219,7 @@ static float radians(float degrees) } // Traces a line from the texel's origin to the sunlight direction and against all nearby thing lights -kexVec3 kexLightmapBuilder::LightTexelSample(kexTrace &trace, const kexVec3 &origin, surface_t *surface) +kexVec3 kexLightmapBuilder::LightTexelSample(const kexVec3 &origin, surface_t *surface) { kexPlane plane = surface->plane; kexVec3 color(0.0f, 0.0f, 0.0f); @@ -275,7 +274,7 @@ kexVec3 kexLightmapBuilder::LightTexelSample(kexTrace &trace, const kexVec3 &ori } } - trace.Trace(lightOrigin, origin); + LevelTraceHit trace = map->Trace(lightOrigin, origin); if (trace.fraction != 1) { @@ -297,7 +296,7 @@ kexVec3 kexLightmapBuilder::LightTexelSample(kexTrace &trace, const kexVec3 &ori if (surface->type != ST_CEILING) { // see if it's exposed to sunlight - if (EmitFromCeiling(trace, surface, origin, plane.Normal(), color)) + if (EmitFromCeiling(surface, origin, plane.Normal(), color)) tracedTexels++; } @@ -306,7 +305,7 @@ kexVec3 kexLightmapBuilder::LightTexelSample(kexTrace &trace, const kexVec3 &ori { kexLightSurface *surfaceLight = map->lightSurfaces[i]; - float attenuation = surfaceLight->TraceSurface(map, trace, surface, origin); + float attenuation = surfaceLight->TraceSurface(map, surface, origin); if (attenuation > 0.0f) { color += surfaceLight->GetRGB() * surfaceLight->Intensity() * attenuation; @@ -424,12 +423,9 @@ void kexLightmapBuilder::TraceSurface(surface_t *surface) kexVec3 tDelta; int i; int j; - kexTrace trace; uint16_t *currentTexture; bool bShouldLookupTexture = false; - trace.Init(*map); - sampleWidth = surface->lightmapDims[0]; sampleHeight = surface->lightmapDims[1]; @@ -463,7 +459,7 @@ void kexLightmapBuilder::TraceSurface(surface_t *surface) (surface->lightmapSteps[0] * multisamplePos.x) + (surface->lightmapSteps[1] * multisamplePos.y); - c += LightTexelSample(trace, pos, surface); + c += LightTexelSample(pos, surface); } c /= multisampleCount; diff --git a/src/lightmap/lightmap.h b/src/lightmap/lightmap.h index 1005ed5..3d4dce9 100644 --- a/src/lightmap/lightmap.h +++ b/src/lightmap/lightmap.h @@ -32,7 +32,6 @@ #define LIGHTMAP_MAX_SIZE 1024 -class kexTrace; class FWadWriter; class kexLightmapBuilder @@ -60,8 +59,8 @@ private: void NewTexture(); bool MakeRoomForBlock(const int width, const int height, int *x, int *y, int *num); kexBBox GetBoundsFromSurface(const surface_t *surface); - kexVec3 LightTexelSample(kexTrace &trace, const kexVec3 &origin, surface_t *surface); - bool EmitFromCeiling(kexTrace &trace, const surface_t *surface, const kexVec3 &origin, const kexVec3 &normal, kexVec3 &color); + kexVec3 LightTexelSample(const kexVec3 &origin, surface_t *surface); + bool EmitFromCeiling(const surface_t *surface, const kexVec3 &origin, const kexVec3 &normal, kexVec3 &color); FLevel *map; std::vector textures; diff --git a/src/lightmap/lightsurface.cpp b/src/lightmap/lightsurface.cpp index 7351569..d322417 100644 --- a/src/lightmap/lightsurface.cpp +++ b/src/lightmap/lightsurface.cpp @@ -34,7 +34,6 @@ #include "math/mathlib.h" #include "level/level.h" -#include "trace.h" #include "lightsurface.h" kexLightSurface::kexLightSurface() @@ -241,7 +240,7 @@ void kexLightSurface::Subdivide(const float divide) } } -float kexLightSurface::TraceSurface(FLevel *doomMap, kexTrace &trace, const surface_t *surf, const kexVec3 &origin) +float kexLightSurface::TraceSurface(FLevel *map, const surface_t *surf, const kexVec3 &origin) { // light surface will always be fullbright if (surf == surface) @@ -302,7 +301,7 @@ float kexLightSurface::TraceSurface(FLevel *doomMap, kexTrace &trace, const surf // trace the origin to the center of the light surface. nudge by the normals in // case the start/end points are directly on or inside the surface - trace.Trace(center + lnormal, origin + normal); + LevelTraceHit trace = map->Trace(center + lnormal, origin + normal); if (trace.fraction < 1.0f) { diff --git a/src/lightmap/lightsurface.h b/src/lightmap/lightsurface.h index dd30f01..93b3a19 100644 --- a/src/lightmap/lightsurface.h +++ b/src/lightmap/lightsurface.h @@ -31,7 +31,6 @@ struct FLevel; struct surfaceLightDef; -class kexTrace; class kexLightSurface { @@ -42,7 +41,7 @@ public: void Init(const surfaceLightDef &lightSurfaceDef, surface_t *surface, const bool bWall); void Subdivide(const float divide); void CreateCenterOrigin(); - float TraceSurface(FLevel *doomMap, kexTrace &trace, const surface_t *surface, const kexVec3 &origin); + float TraceSurface(FLevel *doomMap, const surface_t *surface, const kexVec3 &origin); const float Distance() const { return distance; } const float Intensity() const { return intensity; } diff --git a/src/lightmap/trace.cpp b/src/lightmap/trace.cpp deleted file mode 100644 index 69fc999..0000000 --- a/src/lightmap/trace.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//----------------------------------------------------------------------------- -// Note: this is a modified version of dlight. It is not the original software. -//----------------------------------------------------------------------------- -// -// Copyright (c) 2013-2014 Samuel Villarreal -// svkaiser@gmail.com -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source -// distribution. -// -//----------------------------------------------------------------------------- -// -// DESCRIPTION: General class module for handling ray tracing of the -// world geometry. Ideally, all of this needs to be revisited... -// -//----------------------------------------------------------------------------- - -#include "math/mathlib.h" -#include "level/level.h" -#include "trace.h" - -void kexTrace::Init(FLevel &doomMap) -{ - map = &doomMap; -} - -void kexTrace::Trace(const kexVec3 &startVec, const kexVec3 &endVec) -{ - start = startVec; - end = endVec; - - TraceHit hit = TriangleMeshShape::find_first_hit(map->CollisionMesh.get(), start, end); - fraction = hit.fraction; - if (fraction < 1.0f) - hitSurface = surfaces[hit.surface]; - else - hitSurface = nullptr; -} diff --git a/src/lightmap/trace.h b/src/lightmap/trace.h deleted file mode 100644 index 9f78aff..0000000 --- a/src/lightmap/trace.h +++ /dev/null @@ -1,45 +0,0 @@ -//----------------------------------------------------------------------------- -// Note: this is a modified version of dlight. It is not the original software. -//----------------------------------------------------------------------------- -// -// Copyright (c) 2013-2014 Samuel Villarreal -// svkaiser@gmail.com -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source -// distribution. -// - -#pragma once - -struct FLevel; - -class kexTrace -{ -public: - void Init(FLevel &doomMap); - void Trace(const kexVec3 &startVec, const kexVec3 &endVec); - - kexVec3 start; - kexVec3 end; - surface_t *hitSurface; - float fraction; - -private: - FLevel *map = nullptr; -};