- remove kexTrace class

This commit is contained in:
Magnus Norddahl 2018-11-03 19:01:47 +01:00
parent e5dbc83bc9
commit e89aa8a5d4
9 changed files with 34 additions and 120 deletions

View file

@ -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

View file

@ -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);

View file

@ -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;
}

View file

@ -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;

View file

@ -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<uint16_t*> textures;

View file

@ -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)
{

View file

@ -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; }

View file

@ -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;
}

View file

@ -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;
};