vhlt/hlrad/nomatrix.cpp
2016-09-21 00:07:53 +03:00

330 lines
8.5 KiB
C++

#include "qrad.h"
// =====================================================================================
// CheckVisBit
// =====================================================================================
static bool CheckVisBitNoVismatrix(unsigned patchnum1, unsigned patchnum2
#ifdef HLRAD_HULLU
, vec3_t &transparency_out
#ifdef HLRAD_TRANSPARENCY_CPP
, unsigned int &
#endif
#endif
)
// patchnum1=receiver, patchnum2=emitter. //HLRAD_CheckVisBitNoVismatrix_NOSWAP
{
#ifdef HLRAD_HULLU
#ifndef HLRAD_CheckVisBitNoVismatrix_NOSWAP
// This fix was in vismatrix and sparse methods but not in nomatrix
// Without this nomatrix causes SwapTransfers output lots of errors
if (patchnum1 > patchnum2)
{
const unsigned a = patchnum1;
const unsigned b = patchnum2;
patchnum1 = b;
patchnum2 = a;
}
#endif
if (patchnum1 > g_num_patches)
{
Warning("in CheckVisBit(), patchnum1 > num_patches");
}
if (patchnum2 > g_num_patches)
{
Warning("in CheckVisBit(), patchnum2 > num_patches");
}
#endif
patch_t* patch = &g_patches[patchnum1];
patch_t* patch2 = &g_patches[patchnum2];
#ifdef HLRAD_HULLU
VectorFill(transparency_out, 1.0);
#endif
// if emitter is behind that face plane, skip all patches
if (patch2)
{
const dplane_t* plane2 = getPlaneFromFaceNumber(patch2->faceNumber);
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
if (DotProduct (patch->origin, plane2->normal) > PatchPlaneDist (patch2) + ON_EPSILON - patch->emitter_range)
#else
if (DotProduct(patch->origin, plane2->normal) > (PatchPlaneDist(patch2) + MINIMUM_PATCH_DISTANCE))
#endif
{
// we need to do a real test
const dplane_t* plane = getPlaneFromFaceNumber(patch->faceNumber);
#ifdef HLRAD_HULLU
vec3_t transparency = {1.0,1.0,1.0};
#endif
#ifdef HLRAD_OPAQUE_STYLE
int opaquestyle = -1;
#endif
// check vis between patch and patch2
// if v2 is not behind light plane
// && v2 is visible from v1
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
vec3_t origin1, origin2;
vec3_t delta;
vec_t dist;
VectorSubtract (patch->origin, patch2->origin, delta);
dist = VectorLength (delta);
if (dist < patch2->emitter_range - ON_EPSILON)
{
GetAlternateOrigin (patch->origin, plane->normal, patch2, origin2);
}
else
{
VectorCopy (patch2->origin, origin2);
}
if (DotProduct (origin2, plane->normal) <= PatchPlaneDist (patch) + MINIMUM_PATCH_DISTANCE)
{
return false;
}
if (dist < patch->emitter_range - ON_EPSILON)
{
GetAlternateOrigin (patch2->origin, plane2->normal, patch, origin1);
}
else
{
VectorCopy (patch->origin, origin1);
}
if (DotProduct (origin1, plane2->normal) <= PatchPlaneDist (patch2) + MINIMUM_PATCH_DISTANCE)
{
return false;
}
#else
if (DotProduct(patch2->origin, plane->normal) <= (PatchPlaneDist(patch) + MINIMUM_PATCH_DISTANCE))
{
return false;
}
#endif
#ifdef HLRAD_WATERBLOCKLIGHT
if (TestLine(
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
origin1, origin2
#else
patch->origin, patch2->origin
#endif
) != CONTENTS_EMPTY)
#else
if (TestLine_r(0,
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
origin1, origin2
#else
patch->origin, patch2->origin
#endif
) != CONTENTS_EMPTY)
#endif
{
return false;
}
if (TestSegmentAgainstOpaqueList(
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
origin1, origin2
#else
patch->origin, patch2->origin
#endif
#ifdef HLRAD_HULLU
, transparency
#endif
#ifdef HLRAD_OPAQUE_STYLE
, opaquestyle
#endif
))
{
return false;
}
{
#ifdef HLRAD_OPAQUE_STYLE_BOUNCE
if (opaquestyle != -1)
{
AddStyleToStyleArray (patchnum1, patchnum2, opaquestyle);
}
#endif
#ifdef HLRAD_HULLU
if(g_customshadow_with_bouncelight)
{
VectorCopy(transparency, transparency_out);
}
#endif
return true;
}
}
}
return false;
}
#ifdef HLRAD_TRANSLUCENT
bool CheckVisBitBackwards(unsigned receiver, unsigned emitter, const vec3_t &backorigin, const vec3_t &backnormal
#ifdef HLRAD_HULLU
, vec3_t &transparency_out
#endif
)
{
patch_t* patch = &g_patches[receiver];
patch_t* emitpatch = &g_patches[emitter];
#ifdef HLRAD_HULLU
VectorFill(transparency_out, 1.0);
#endif
if (emitpatch)
{
const dplane_t* emitplane = getPlaneFromFaceNumber(emitpatch->faceNumber);
if (DotProduct(backorigin, emitplane->normal) > (PatchPlaneDist(emitpatch) + MINIMUM_PATCH_DISTANCE))
{
#ifdef HLRAD_HULLU
vec3_t transparency = {1.0,1.0,1.0};
#endif
#ifdef HLRAD_OPAQUE_STYLE
int opaquestyle = -1;
#endif
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
vec3_t emitorigin;
vec3_t delta;
vec_t dist;
VectorSubtract (backorigin, emitpatch->origin, delta);
dist = VectorLength (delta);
if (dist < emitpatch->emitter_range - ON_EPSILON)
{
GetAlternateOrigin (backorigin, backnormal, emitpatch, emitorigin);
}
else
{
VectorCopy (emitpatch->origin, emitorigin);
}
if (DotProduct (emitorigin, backnormal) <= DotProduct (backorigin, backnormal) + MINIMUM_PATCH_DISTANCE)
{
return false;
}
#else
if (DotProduct(emitpatch->origin, backnormal) <= (DotProduct(backorigin, backnormal) + MINIMUM_PATCH_DISTANCE))
{
return false;
}
#endif
#ifdef HLRAD_WATERBLOCKLIGHT
if (TestLine(
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
backorigin, emitorigin
#else
backorigin, emitpatch->origin
#endif
) != CONTENTS_EMPTY)
#else
if (TestLine_r(0,
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
backorigin, emitorigin
#else
backorigin, emitpatch->origin
#endif
) != CONTENTS_EMPTY)
#endif
{
return false;
}
if (TestSegmentAgainstOpaqueList(
#ifdef HLRAD_ACCURATEBOUNCE_ALTERNATEORIGIN
backorigin, emitorigin
#else
backorigin, emitpatch->origin
#endif
#ifdef HLRAD_HULLU
, transparency
#endif
#ifdef HLRAD_OPAQUE_STYLE
, opaquestyle
#endif
))
{
return false;
}
{
#ifdef HLRAD_OPAQUE_STYLE_BOUNCE
if (opaquestyle != -1)
{
AddStyleToStyleArray (receiver, emitter, opaquestyle);
}
#endif
#ifdef HLRAD_HULLU
if(g_customshadow_with_bouncelight)
{
VectorCopy(transparency, transparency_out);
}
#endif
return true;
}
}
}
return false;
}
#endif
//
// end old vismat.c
////////////////////////////
void MakeScalesNoVismatrix()
{
char transferfile[_MAX_PATH];
hlassume(g_num_patches < MAX_PATCHES, assume_MAX_PATCHES);
#ifdef ZHLT_DEFAULTEXTENSION_FIX
safe_snprintf(transferfile, _MAX_PATH, "%s.inc", g_Mapname);
#else
safe_strncpy(transferfile, g_source, _MAX_PATH);
StripExtension(transferfile);
DefaultExtension(transferfile, ".inc");
#endif
if (!g_incremental || !readtransfers(transferfile, g_num_patches))
{
g_CheckVisBit = CheckVisBitNoVismatrix;
#ifndef HLRAD_HULLU
NamedRunThreadsOn(g_num_patches, g_estimate, MakeScales);
#else
if(g_rgb_transfers)
{NamedRunThreadsOn(g_num_patches, g_estimate, MakeRGBScales);}
else
{NamedRunThreadsOn(g_num_patches, g_estimate, MakeScales);}
#endif
#ifndef HLRAD_NOSWAP
// invert the transfers for gather vs scatter
#ifndef HLRAD_HULLU
NamedRunThreadsOnIndividual(g_num_patches, g_estimate, SwapTransfers);
#else
if(g_rgb_transfers)
{NamedRunThreadsOnIndividual(g_num_patches, g_estimate, SwapRGBTransfers);}
else
{NamedRunThreadsOnIndividual(g_num_patches, g_estimate, SwapTransfers);}
#endif
#endif /*HLRAD_NOSWAP*/
if (g_incremental)
{
writetransfers(transferfile, g_num_patches);
}
else
{
unlink(transferfile);
}
DumpTransfersMemoryUsage();
#ifdef HLRAD_OPAQUE_STYLE_BOUNCE
CreateFinalStyleArrays ("dynamic shadow array");
#endif
}
}