zdray/src/lightmap/cpuraytracer.h

104 lines
1.7 KiB
C
Raw Normal View History

2021-11-11 04:04:33 +00:00
#pragma once
2021-11-15 22:36:29 +00:00
#include <functional>
2021-11-15 23:30:54 +00:00
#include "collision.h"
2021-11-15 22:36:29 +00:00
2021-11-11 04:04:33 +00:00
class LevelMesh;
struct CPUTraceTask
{
int id, x, y;
};
struct CPULightInfo
{
vec3 Origin;
2021-11-11 04:04:33 +00:00
float Radius;
float Intensity;
float InnerAngleCos;
float OuterAngleCos;
vec3 SpotDir;
vec3 Color;
2021-11-11 04:04:33 +00:00
};
struct CPUTraceState
{
uint32_t SampleIndex;
uint32_t SampleCount;
uint32_t PassType;
uint32_t LightCount;
vec3 SunDir;
2021-11-11 04:04:33 +00:00
float SampleDistance;
vec3 SunColor;
2021-11-11 04:04:33 +00:00
float SunIntensity;
vec3 HemisphereVec;
2021-11-11 04:04:33 +00:00
vec3 StartPosition;
2021-11-11 04:04:33 +00:00
Surface* StartSurface;
vec3 Position;
2021-11-12 16:08:15 +00:00
Surface* Surf;
2021-11-11 04:04:33 +00:00
vec3 Output;
2021-11-11 04:04:33 +00:00
float OutputAttenuation;
bool EndTrace;
};
struct CPUEmissiveSurface
{
float Distance;
float Intensity;
vec3 Color;
2021-11-11 04:04:33 +00:00
};
struct LevelTraceHit
{
vec3 start;
vec3 end;
2021-11-11 04:04:33 +00:00
float fraction;
Surface* hitSurface;
int indices[3];
float b, c;
};
class CPURaytracer
{
public:
CPURaytracer();
~CPURaytracer();
void Raytrace(LevelMesh* level);
private:
void RaytraceTask(const CPUTraceTask& task);
void RunBounceTrace(CPUTraceState& state);
void RunLightTrace(CPUTraceState& state);
CPUEmissiveSurface GetEmissive(Surface* surface);
void CreateHemisphereVectors();
void CreateLights();
LevelTraceHit Trace(const vec3& startVec, const vec3& endVec);
bool TraceAnyHit(const vec3& startVec, const vec3& endVec);
2021-11-11 04:04:33 +00:00
static vec3 ImportanceSample(const vec3& HemisphereVec, vec3 N);
2021-11-11 04:04:33 +00:00
static float RadicalInverse_VdC(uint32_t bits);
static vec2 Hammersley(uint32_t i, uint32_t N);
2021-11-11 04:04:33 +00:00
2021-11-15 22:36:29 +00:00
static void RunJob(int count, std::function<void(int i)> callback);
2021-11-11 04:04:33 +00:00
const int coverageSampleCount = 256;
const int bounceSampleCount = 2048;
LevelMesh* mesh = nullptr;
std::vector<vec3> HemisphereVectors;
2021-11-11 04:04:33 +00:00
std::vector<CPULightInfo> Lights;
std::unique_ptr<TriangleMeshShape> CollisionMesh;
};