no more Vector!
This commit is contained in:
parent
e1695ebfd3
commit
e0ed70cc87
|
|
@ -326,7 +326,7 @@ template<typename T, typename U, typename L = std::common_type_t<typename T::val
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t N, class T>
|
template<size_t N, class T>
|
||||||
[[nodiscard]] qvec<T, N> floor(const qvec<T, N> &v1)
|
[[nodiscard]] inline qvec<T, N> floor(const qvec<T, N> &v1)
|
||||||
{
|
{
|
||||||
qvec<T, N> res;
|
qvec<T, N> res;
|
||||||
for (size_t i = 0; i < N; i++) {
|
for (size_t i = 0; i < N; i++) {
|
||||||
|
|
@ -336,7 +336,17 @@ template<size_t N, class T>
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t N, class T>
|
template<size_t N, class T>
|
||||||
[[nodiscard]] qvec<T, N> pow(const qvec<T, N> &v1, const qvec<T, N> &v2)
|
[[nodiscard]] inline qvec<T, N> ceil(const qvec<T, N> &v1)
|
||||||
|
{
|
||||||
|
qvec<T, N> res;
|
||||||
|
for (size_t i = 0; i < N; i++) {
|
||||||
|
res[i] = std::ceil(v1[i]);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t N, class T>
|
||||||
|
[[nodiscard]] inline qvec<T, N> pow(const qvec<T, N> &v1, const qvec<T, N> &v2)
|
||||||
{
|
{
|
||||||
qvec<T, N> res;
|
qvec<T, N> res;
|
||||||
for (size_t i = 0; i < N; i++) {
|
for (size_t i = 0; i < N; i++) {
|
||||||
|
|
@ -388,11 +398,7 @@ template<size_t N, class T>
|
||||||
template<size_t N, class T>
|
template<size_t N, class T>
|
||||||
[[nodiscard]] constexpr T length2(const qvec<T, N> &v1)
|
[[nodiscard]] constexpr T length2(const qvec<T, N> &v1)
|
||||||
{
|
{
|
||||||
T len2 = 0;
|
return qv::dot(v1, v1);
|
||||||
for (size_t i = 0; i < N; i++) {
|
|
||||||
len2 += (v1[i] * v1[i]);
|
|
||||||
}
|
|
||||||
return len2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t N, class T>
|
template<size_t N, class T>
|
||||||
|
|
@ -873,29 +879,6 @@ namespace qv
|
||||||
[[nodiscard]] qmat2x2f inverse(const qmat2x2f &input);
|
[[nodiscard]] qmat2x2f inverse(const qmat2x2f &input);
|
||||||
}; // namespace qv
|
}; // namespace qv
|
||||||
|
|
||||||
// "vec3" type. legacy; eventually will be replaced entirely
|
|
||||||
#define DEPRECATE_SNIFF [[deprecated]]
|
|
||||||
|
|
||||||
|
|
||||||
#undef DEPRECATE_SNIFF
|
|
||||||
#define DEPRECATE_SNIFF
|
|
||||||
|
|
||||||
template<typename TFrom, typename TTo>
|
|
||||||
DEPRECATE_SNIFF constexpr void VectorCopy(const TFrom &in, TTo &out)
|
|
||||||
{
|
|
||||||
out[0] = in[0];
|
|
||||||
out[1] = in[1];
|
|
||||||
out[2] = in[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename TFrom, typename TScale, typename TTo>
|
|
||||||
DEPRECATE_SNIFF constexpr void VectorScale(const TFrom &v, TScale scale, TTo &out)
|
|
||||||
{
|
|
||||||
out[0] = v[0] * scale;
|
|
||||||
out[1] = v[1] * scale;
|
|
||||||
out[2] = v[2] * scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns the normalized direction from `start` to `stop` in the `dir` param
|
// returns the normalized direction from `start` to `stop` in the `dir` param
|
||||||
// returns the distance from `start` to `stop`
|
// returns the distance from `start` to `stop`
|
||||||
template<typename Tstart, typename Tstop, typename Tdir>
|
template<typename Tstart, typename Tstop, typename Tdir>
|
||||||
|
|
|
||||||
|
|
@ -259,8 +259,8 @@ private:
|
||||||
{
|
{
|
||||||
// apply transform
|
// apply transform
|
||||||
switch (_transformer) {
|
switch (_transformer) {
|
||||||
case vec3_transformer_t::NONE: VectorCopy(val, out); break;
|
case vec3_transformer_t::NONE: out = val; break;
|
||||||
case vec3_transformer_t::MANGLE_TO_VEC: VectorCopy(vec_from_mangle(val), out); break;
|
case vec3_transformer_t::MANGLE_TO_VEC: out = vec_from_mangle(val); break;
|
||||||
case vec3_transformer_t::NORMALIZE_COLOR_TO_255:
|
case vec3_transformer_t::NORMALIZE_COLOR_TO_255:
|
||||||
out = val;
|
out = val;
|
||||||
normalize_color_format(out);
|
normalize_color_format(out);
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ static unique_ptr<patch_t> MakePatch(const mbsp_t *bsp, const globalconfig_t &cf
|
||||||
p->w = std::move(w);
|
p->w = std::move(w);
|
||||||
|
|
||||||
// cache some stuff
|
// cache some stuff
|
||||||
VectorCopy(&p->w.center()[0], p->center);
|
p->center = p->w.center();
|
||||||
p->plane = p->w.plane();
|
p->plane = p->w.plane();
|
||||||
|
|
||||||
// nudge the cernter point 1 unit off
|
// nudge the cernter point 1 unit off
|
||||||
|
|
|
||||||
|
|
@ -432,7 +432,7 @@ static void SetupSun(const globalconfig_t &cfg, vec_t light, const qvec3d &color
|
||||||
|
|
||||||
/* calculate sun direction */
|
/* calculate sun direction */
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
VectorCopy(sunvec, direction);
|
direction = sunvec;
|
||||||
} else {
|
} else {
|
||||||
vec_t da, de;
|
vec_t da, de;
|
||||||
vec_t d = sqrt(sunvec[0] * sunvec[0] + sunvec[1] * sunvec[1]);
|
vec_t d = sqrt(sunvec[0] * sunvec[0] + sunvec[1] * sunvec[1]);
|
||||||
|
|
@ -974,8 +974,7 @@ void LoadEntities(const globalconfig_t &cfg, const mbsp_t *bsp)
|
||||||
entity.settings().setSettings(*entity.epairs, false);
|
entity.settings().setSettings(*entity.epairs, false);
|
||||||
|
|
||||||
if (entity.mangle.isChanged()) {
|
if (entity.mangle.isChanged()) {
|
||||||
const qvec3f temp = vec_from_mangle(entity.mangle.vec3Value());
|
entity.spotvec = vec_from_mangle(entity.mangle.vec3Value());
|
||||||
VectorCopy(temp, entity.spotvec);
|
|
||||||
entity.spotlight = true;
|
entity.spotlight = true;
|
||||||
|
|
||||||
if (!entity.projangle.isChanged()) {
|
if (!entity.projangle.isChanged()) {
|
||||||
|
|
@ -1352,7 +1351,7 @@ static void SubdividePolygon(const mface_t *face, const modelinfo_t *face_modeli
|
||||||
// wrap cases
|
// wrap cases
|
||||||
dist[j] = dist[0];
|
dist[j] = dist[0];
|
||||||
v -= i;
|
v -= i;
|
||||||
VectorCopy(verts, v);
|
v = verts;
|
||||||
|
|
||||||
f = b = 0;
|
f = b = 0;
|
||||||
v = verts;
|
v = verts;
|
||||||
|
|
|
||||||
|
|
@ -677,11 +677,8 @@ static void CalcPoints(
|
||||||
|
|
||||||
surf->occluded[i] = !res.m_unoccluded;
|
surf->occluded[i] = !res.m_unoccluded;
|
||||||
*realfacenum = res.m_actualFace != nullptr ? Face_GetNum(bsp, res.m_actualFace) : -1;
|
*realfacenum = res.m_actualFace != nullptr ? Face_GetNum(bsp, res.m_actualFace) : -1;
|
||||||
VectorCopy(res.m_position, point);
|
point = res.m_position + offset;
|
||||||
VectorCopy(res.m_interpolatedNormal, norm);
|
norm = res.m_interpolatedNormal;
|
||||||
|
|
||||||
// apply model offset after calling CalcPointNormal
|
|
||||||
point += offset;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -745,17 +742,17 @@ static bool Lightsurf_Init(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the plane, not including model offset */
|
/* Set up the plane, not including model offset */
|
||||||
qplane3d *plane = &lightsurf->plane;
|
qplane3d &plane = lightsurf->plane;
|
||||||
VectorCopy(bsp->dplanes[face->planenum].normal, plane->normal);
|
|
||||||
plane->dist = bsp->dplanes[face->planenum].dist;
|
|
||||||
if (face->side) {
|
if (face->side) {
|
||||||
*plane = -*plane;
|
plane = -bsp->dplanes[face->planenum];
|
||||||
|
} else {
|
||||||
|
plane = bsp->dplanes[face->planenum];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the texorg for coordinate transformation */
|
/* Set up the texorg for coordinate transformation */
|
||||||
lightsurf->texorg.texSpaceToWorld = TexSpaceToWorld(bsp, face);
|
lightsurf->texorg.texSpaceToWorld = TexSpaceToWorld(bsp, face);
|
||||||
lightsurf->texorg.texinfo = &bsp->texinfo[face->texinfo];
|
lightsurf->texorg.texinfo = &bsp->texinfo[face->texinfo];
|
||||||
lightsurf->texorg.planedist = plane->dist;
|
lightsurf->texorg.planedist = plane.dist;
|
||||||
|
|
||||||
/* Check for invalid texture axes */
|
/* Check for invalid texture axes */
|
||||||
if (std::isnan(lightsurf->texorg.texSpaceToWorld.at(0, 0))) {
|
if (std::isnan(lightsurf->texorg.texSpaceToWorld.at(0, 0))) {
|
||||||
|
|
@ -774,8 +771,8 @@ static bool Lightsurf_Init(
|
||||||
|
|
||||||
/* Correct the plane for the model offset (must be done last,
|
/* Correct the plane for the model offset (must be done last,
|
||||||
calculation of face extents / points needs the uncorrected plane) */
|
calculation of face extents / points needs the uncorrected plane) */
|
||||||
qvec3d planepoint = (plane->normal * plane->dist) + modelinfo->offset;
|
qvec3d planepoint = (plane.normal * plane.dist) + modelinfo->offset;
|
||||||
plane->dist = qv::dot(plane->normal, planepoint);
|
plane.dist = qv::dot(plane.normal, planepoint);
|
||||||
|
|
||||||
/* Correct bounding sphere */
|
/* Correct bounding sphere */
|
||||||
lightsurf->origin += modelinfo->offset;
|
lightsurf->origin += modelinfo->offset;
|
||||||
|
|
@ -968,13 +965,13 @@ static void GetLightContrib(const globalconfig_t &cfg, const light_t *entity, co
|
||||||
col[i] *= entcol[i] * (1.0f / 255.0f);
|
col[i] *= entcol[i] * (1.0f / 255.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorScale(col, add * (1.0f / 255.0f), color_out);
|
color_out = col * add * (1.0f / 255.0f);
|
||||||
} else {
|
} else {
|
||||||
VectorScale(entity->color.vec3Value(), add * (1.0f / 255.0f), color_out);
|
color_out = entity->color.vec3Value() * add * (1.0f / 255.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// write normalmap contrib
|
// write normalmap contrib
|
||||||
VectorScale(surfpointToLightDir_out, add, normalmap_addition_out);
|
normalmap_addition_out = surfpointToLightDir_out * add;
|
||||||
|
|
||||||
*dist_out = dist;
|
*dist_out = dist;
|
||||||
}
|
}
|
||||||
|
|
@ -1255,10 +1252,8 @@ std::map<int, qvec3f> GetDirectLighting(
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Write out the final color
|
// Write out the final color
|
||||||
qvec3d color;
|
// color_out is expected to be in [0..255] range, vpl->color is in [0..1] range.
|
||||||
VectorScale(
|
qvec3d color = (vpl.color * add) * cfg.surflightbouncescale.floatValue();
|
||||||
vpl.color, add, color); // color_out is expected to be in [0..255] range, vpl->color is in [0..1] range.
|
|
||||||
VectorScale(color, cfg.surflightbouncescale.floatValue(), color);
|
|
||||||
|
|
||||||
// NOTE: Skip negative lights, which would make no sense to bounce!
|
// NOTE: Skip negative lights, which would make no sense to bounce!
|
||||||
if (LightSample_Brightness(color) <= fadegate)
|
if (LightSample_Brightness(color) <= fadegate)
|
||||||
|
|
@ -1287,7 +1282,7 @@ std::map<int, qvec3f> GetDirectLighting(
|
||||||
GetLightContrib(
|
GetLightContrib(
|
||||||
cfg, &entity, normal, origin, false, color, surfpointToLightDir, normalcontrib, &surfpointToLightDist);
|
cfg, &entity, normal, origin, false, color, surfpointToLightDir, normalcontrib, &surfpointToLightDist);
|
||||||
|
|
||||||
VectorScale(color, entity.bouncescale.floatValue(), color);
|
color *= entity.bouncescale.floatValue();
|
||||||
|
|
||||||
// NOTE: Skip negative lights, which would make no sense to bounce!
|
// NOTE: Skip negative lights, which would make no sense to bounce!
|
||||||
if (LightSample_Brightness(color) <= fadegate) {
|
if (LightSample_Brightness(color) <= fadegate) {
|
||||||
|
|
@ -1409,7 +1404,7 @@ static void LightFace_Entity(
|
||||||
|
|
||||||
const float occlusion =
|
const float occlusion =
|
||||||
Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], entity, surfpointToLightDist, lightsurf);
|
Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], entity, surfpointToLightDist, lightsurf);
|
||||||
VectorScale(color, occlusion, color);
|
color *= occlusion;
|
||||||
|
|
||||||
/* Quick distance check first */
|
/* Quick distance check first */
|
||||||
if (fabs(LightSample_Brightness(color)) <= fadegate) {
|
if (fabs(LightSample_Brightness(color)) <= fadegate) {
|
||||||
|
|
@ -1515,15 +1510,15 @@ static void LightFace_Sky(const sun_t *sun, const lightsurf_t *lightsurf, lightm
|
||||||
value *= Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], NULL, 0.0, lightsurf);
|
value *= Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], NULL, 0.0, lightsurf);
|
||||||
}
|
}
|
||||||
|
|
||||||
qvec3d color, normalcontrib;
|
qvec3d color = sun->sunlight_color * (value / 255.0);
|
||||||
VectorScale(sun->sunlight_color, value / 255.0, color);
|
|
||||||
VectorScale(sun->sunvec, value, normalcontrib);
|
|
||||||
|
|
||||||
/* Quick distance check first */
|
/* Quick distance check first */
|
||||||
if (fabs(LightSample_Brightness(color)) <= fadegate) {
|
if (fabs(LightSample_Brightness(color)) <= fadegate) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qvec3d normalcontrib = sun->sunvec * value;
|
||||||
|
|
||||||
rs->pushRay(i, surfpoint, incoming, MAX_SKY_DIST, &color, &normalcontrib);
|
rs->pushRay(i, surfpoint, incoming, MAX_SKY_DIST, &color, &normalcontrib);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1755,7 +1750,7 @@ static void LightFace_BounceLightsDebug(const lightsurf_t *lightsurf, lightmapdi
|
||||||
|
|
||||||
lightmap_t *lightmap = Lightmap_ForStyle(lightmaps, styleColor.first, lightsurf);
|
lightmap_t *lightmap = Lightmap_ForStyle(lightmaps, styleColor.first, lightsurf);
|
||||||
lightsample_t *sample = &lightmap->samples[i];
|
lightsample_t *sample = &lightmap->samples[i];
|
||||||
VectorCopy(patch_color, sample->color);
|
sample->color = patch_color;
|
||||||
Lightmap_Save(lightmaps, lightsurf, lightmap, styleColor.first);
|
Lightmap_Save(lightmaps, lightsurf, lightmap, styleColor.first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1950,18 +1945,13 @@ static void LightFace_Bounce(
|
||||||
continue; // FIXME: nudge or something
|
continue; // FIXME: nudge or something
|
||||||
dir /= dist;
|
dir /= dist;
|
||||||
|
|
||||||
const qvec3f indirect =
|
const qvec3d indirect =
|
||||||
GetIndirectLighting(cfg, &vpl, color, dir, dist, lightsurf->points[i], lightsurf->normals[i]);
|
GetIndirectLighting(cfg, &vpl, color, dir, dist, lightsurf->points[i], lightsurf->normals[i]);
|
||||||
|
|
||||||
if (LightSample_Brightness(indirect) < 0.25)
|
if (LightSample_Brightness(indirect) < 0.25)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
qvec3d vplPos, vplDir, vplColor;
|
rs->pushRay(i, vpl.pos, dir, dist, &indirect);
|
||||||
VectorCopy(vpl.pos, vplPos);
|
|
||||||
VectorCopy(dir, vplDir);
|
|
||||||
VectorCopy(indirect, vplColor);
|
|
||||||
|
|
||||||
rs->pushRay(i, vplPos, vplDir, dist, &vplColor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rs->numPushedRays())
|
if (!rs->numPushedRays())
|
||||||
|
|
@ -1987,7 +1977,7 @@ static void LightFace_Bounce(
|
||||||
*/
|
*/
|
||||||
if (debugmode != debugmode_bounce) {
|
if (debugmode != debugmode_bounce) {
|
||||||
const vec_t dirtscale = Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], NULL, 0.0, lightsurf);
|
const vec_t dirtscale = Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], NULL, 0.0, lightsurf);
|
||||||
VectorScale(indirect, dirtscale, indirect);
|
indirect *= dirtscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
lightsample_t *sample = &lightmap->samples[i];
|
lightsample_t *sample = &lightmap->samples[i];
|
||||||
|
|
@ -2094,10 +2084,7 @@ static void LightFace_Bounce(
|
||||||
colorAvg /= Nhits;
|
colorAvg /= Nhits;
|
||||||
|
|
||||||
lightsample_t *sample = &lightmap->samples[i];
|
lightsample_t *sample = &lightmap->samples[i];
|
||||||
|
sample->color += colorAvg;
|
||||||
qvec3d indirectTmp;
|
|
||||||
VectorCopy(colorAvg, indirectTmp);
|
|
||||||
sample->color += indirectTmp;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2138,7 +2125,7 @@ LightFace_SurfaceLight(const lightsurf_t *lightsurf, lightmapdict_t *lightmaps)
|
||||||
else
|
else
|
||||||
dir /= dist;
|
dir /= dist;
|
||||||
|
|
||||||
const qvec3f indirect = GetSurfaceLighting(cfg, &vpl, dir, dist, lightsurf_normal);
|
const qvec3d indirect = GetSurfaceLighting(cfg, &vpl, dir, dist, lightsurf_normal);
|
||||||
if (LightSample_Brightness(indirect) < 0.01f) // Each point contributes very little to the final result
|
if (LightSample_Brightness(indirect) < 0.01f) // Each point contributes very little to the final result
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
@ -2152,12 +2139,7 @@ LightFace_SurfaceLight(const lightsurf_t *lightsurf, lightmapdict_t *lightmaps)
|
||||||
else
|
else
|
||||||
dir /= dist;
|
dir /= dist;
|
||||||
|
|
||||||
qvec3d vplPos, vplDir, vplColor;
|
rs->pushRay(i, pos, dir, dist, &indirect);
|
||||||
VectorCopy(pos, vplPos);
|
|
||||||
VectorCopy(dir, vplDir);
|
|
||||||
VectorCopy(indirect, vplColor);
|
|
||||||
|
|
||||||
rs->pushRay(i, vplPos, vplDir, dist, &vplColor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rs->numPushedRays())
|
if (!rs->numPushedRays())
|
||||||
|
|
@ -2182,7 +2164,7 @@ LightFace_SurfaceLight(const lightsurf_t *lightsurf, lightmapdict_t *lightmaps)
|
||||||
|
|
||||||
// Use dirt scaling on the surface lighting.
|
// Use dirt scaling on the surface lighting.
|
||||||
const vec_t dirtscale = Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], nullptr, 0.0, lightsurf);
|
const vec_t dirtscale = Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], nullptr, 0.0, lightsurf);
|
||||||
VectorScale(indirect, dirtscale, indirect);
|
indirect *= dirtscale;
|
||||||
|
|
||||||
lightsample_t *sample = &lightmap->samples[i];
|
lightsample_t *sample = &lightmap->samples[i];
|
||||||
sample->color += indirect;
|
sample->color += indirect;
|
||||||
|
|
@ -2209,9 +2191,9 @@ static void LightFace_OccludedDebug(lightsurf_t *lightsurf, lightmapdict_t *ligh
|
||||||
for (int i = 0; i < lightsurf->numpoints; i++) {
|
for (int i = 0; i < lightsurf->numpoints; i++) {
|
||||||
lightsample_t *sample = &lightmap->samples[i];
|
lightsample_t *sample = &lightmap->samples[i];
|
||||||
if (lightsurf->occluded[i]) {
|
if (lightsurf->occluded[i]) {
|
||||||
VectorCopy(qvec3f(255, 0, 0), sample->color);
|
sample->color = { 255, 0, 0 };
|
||||||
} else {
|
} else {
|
||||||
VectorCopy(qvec3f(0, 255, 0), sample->color);
|
sample->color = { 0, 255, 0 };
|
||||||
}
|
}
|
||||||
// N.B.: Mark it as un-occluded now, to disable special handling later in the -extra/-extra4 downscaling code
|
// N.B.: Mark it as un-occluded now, to disable special handling later in the -extra/-extra4 downscaling code
|
||||||
lightsurf->occluded[i] = false;
|
lightsurf->occluded[i] = false;
|
||||||
|
|
@ -2248,12 +2230,12 @@ static void LightFace_DebugNeighbours(lightsurf_t *lightsurf, lightmapdict_t *li
|
||||||
|
|
||||||
if (sample_face == dump_facenum) {
|
if (sample_face == dump_facenum) {
|
||||||
/* Red - the sample is on the selected face */
|
/* Red - the sample is on the selected face */
|
||||||
VectorCopy(qvec3f(255, 0, 0), sample->color);
|
sample->color = { 255, 0, 0 };
|
||||||
} else if (has_sample_on_dumpface) {
|
} else if (has_sample_on_dumpface) {
|
||||||
/* Green - the face has some samples on the selected face */
|
/* Green - the face has some samples on the selected face */
|
||||||
VectorCopy(qvec3f(0, 255, 0), sample->color);
|
sample->color = { 0, 255, 0 };
|
||||||
} else {
|
} else {
|
||||||
VectorCopy(qvec3f(0, 0, 0), sample->color);
|
sample->color = { };
|
||||||
}
|
}
|
||||||
// N.B.: Mark it as un-occluded now, to disable special handling later in the -extra/-extra4 downscaling code
|
// N.B.: Mark it as un-occluded now, to disable special handling later in the -extra/-extra4 downscaling code
|
||||||
lightsurf->occluded[i] = false;
|
lightsurf->occluded[i] = false;
|
||||||
|
|
@ -2508,7 +2490,7 @@ static void LightFace_ScaleAndClamp(const lightsurf_t *lightsurf, lightmapdict_t
|
||||||
color = qv::max(color, {0});
|
color = qv::max(color, {0});
|
||||||
|
|
||||||
/* Scale and clamp any out-of-range samples */
|
/* Scale and clamp any out-of-range samples */
|
||||||
VectorScale(color, cfg.rangescale.floatValue(), color);
|
color *= cfg.rangescale.floatValue();
|
||||||
|
|
||||||
for (auto &c : color) {
|
for (auto &c : color) {
|
||||||
c = pow(c / 255.0f, 1.0 / cfg.lightmapgamma.floatValue()) * 255.0f;
|
c = pow(c / 255.0f, 1.0 / cfg.lightmapgamma.floatValue()) * 255.0f;
|
||||||
|
|
@ -2517,7 +2499,7 @@ static void LightFace_ScaleAndClamp(const lightsurf_t *lightsurf, lightmapdict_t
|
||||||
vec_t maxcolor = qv::max(color);
|
vec_t maxcolor = qv::max(color);
|
||||||
|
|
||||||
if (maxcolor > 255) {
|
if (maxcolor > 255) {
|
||||||
VectorScale(color, 255.0f / maxcolor, color);
|
color *= (255.0f / maxcolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -125,11 +125,11 @@ static void *MakeSurfaceLightsThread(void *arg)
|
||||||
// There are other more complex variants we could handle documented in the link above.
|
// There are other more complex variants we could handle documented in the link above.
|
||||||
// FIXME: we require value to be nonzero, see the check above - not sure if this matches arghrad
|
// FIXME: we require value to be nonzero, see the check above - not sure if this matches arghrad
|
||||||
if (cfg.sky_surface.isChanged()) {
|
if (cfg.sky_surface.isChanged()) {
|
||||||
VectorCopy(cfg.sky_surface.vec3Value(), texturecolor);
|
texturecolor = cfg.sky_surface.vec3Value();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorScale(texturecolor, info->value, texturecolor); // Scale by light value
|
texturecolor *= info->value; // Scale by light value
|
||||||
|
|
||||||
// Calculate intensity...
|
// Calculate intensity...
|
||||||
float intensity = qv::max(texturecolor);
|
float intensity = qv::max(texturecolor);
|
||||||
|
|
@ -139,7 +139,7 @@ static void *MakeSurfaceLightsThread(void *arg)
|
||||||
|
|
||||||
// Normalize color...
|
// Normalize color...
|
||||||
if (intensity > 1.0f)
|
if (intensity > 1.0f)
|
||||||
VectorScale(texturecolor, 1.0f / intensity, texturecolor);
|
texturecolor *= 1.0f / intensity;
|
||||||
|
|
||||||
// Sanity checks...
|
// Sanity checks...
|
||||||
Q_assert(!points.empty());
|
Q_assert(!points.empty());
|
||||||
|
|
@ -149,12 +149,12 @@ static void *MakeSurfaceLightsThread(void *arg)
|
||||||
l.surfnormal = facenormal;
|
l.surfnormal = facenormal;
|
||||||
l.omnidirectional = (info->flags.native & Q2_SURF_SKY) ? true : false;
|
l.omnidirectional = (info->flags.native & Q2_SURF_SKY) ? true : false;
|
||||||
l.points = points;
|
l.points = points;
|
||||||
VectorCopy(facemidpoint, l.pos);
|
l.pos = facemidpoint;
|
||||||
|
|
||||||
// Store surfacelight settings...
|
// Store surfacelight settings...
|
||||||
l.totalintensity = intensity * facearea;
|
l.totalintensity = intensity * facearea;
|
||||||
l.intensity = l.totalintensity / points.size();
|
l.intensity = l.totalintensity / points.size();
|
||||||
VectorCopy(texturecolor, l.color);
|
l.color = texturecolor;
|
||||||
|
|
||||||
// Init bbox...
|
// Init bbox...
|
||||||
l.bounds = qvec3d(0);
|
l.bounds = qvec3d(0);
|
||||||
|
|
|
||||||
|
|
@ -850,10 +850,10 @@ public:
|
||||||
_rays_maxdist[_numrays] = dist;
|
_rays_maxdist[_numrays] = dist;
|
||||||
_point_indices[_numrays] = i;
|
_point_indices[_numrays] = i;
|
||||||
if (color) {
|
if (color) {
|
||||||
VectorCopy(*color, _ray_colors[_numrays]);
|
_ray_colors[_numrays] = *color;
|
||||||
}
|
}
|
||||||
if (normalcontrib) {
|
if (normalcontrib) {
|
||||||
VectorCopy(*normalcontrib, _ray_normalcontribs[_numrays]);
|
_ray_normalcontribs[_numrays] = *normalcontrib;
|
||||||
}
|
}
|
||||||
_ray_dynamic_styles[_numrays] = 0;
|
_ray_dynamic_styles[_numrays] = 0;
|
||||||
_numrays++;
|
_numrays++;
|
||||||
|
|
@ -933,10 +933,10 @@ public:
|
||||||
_rays_maxdist[_numrays] = dist;
|
_rays_maxdist[_numrays] = dist;
|
||||||
_point_indices[_numrays] = i;
|
_point_indices[_numrays] = i;
|
||||||
if (color) {
|
if (color) {
|
||||||
VectorCopy(*color, _ray_colors[_numrays]);
|
_ray_colors[_numrays] = *color;
|
||||||
}
|
}
|
||||||
if (normalcontrib) {
|
if (normalcontrib) {
|
||||||
VectorCopy(*normalcontrib, _ray_normalcontribs[_numrays]);
|
_ray_normalcontribs[_numrays] = *normalcontrib;
|
||||||
}
|
}
|
||||||
_ray_dynamic_styles[_numrays] = 0;
|
_ray_dynamic_styles[_numrays] = 0;
|
||||||
_numrays++;
|
_numrays++;
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ static void CheckFace(face_t *face, const mapface_t &sourceface)
|
||||||
LogPrint("WARNING: Line {}: Healing degenerate edge ({}) at ({:.3f} {:.3} {:.3})\n", sourceface.linenum,
|
LogPrint("WARNING: Line {}: Healing degenerate edge ({}) at ({:.3f} {:.3} {:.3})\n", sourceface.linenum,
|
||||||
length, p1[0], p1[1], p1[2]);
|
length, p1[0], p1[1], p1[2]);
|
||||||
for (size_t j = i + 1; j < face->w.size(); j++)
|
for (size_t j = i + 1; j < face->w.size(); j++)
|
||||||
VectorCopy(face->w[j], face->w[j - 1]);
|
face->w[j - 1] = face->w[j];
|
||||||
face->w.resize(face->w.size() - 1);
|
face->w.resize(face->w.size() - 1);
|
||||||
CheckFace(face, sourceface);
|
CheckFace(face, sourceface);
|
||||||
break;
|
break;
|
||||||
|
|
@ -378,8 +378,8 @@ static face_t *CreateBrushFaces(const mapentity_t *src, hullbrush_t *hullbrush,
|
||||||
mapface.texinfo = FindTexinfo(texInfoNew);
|
mapface.texinfo = FindTexinfo(texInfoNew);
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorCopy(mapface.plane.normal, plane.normal);
|
plane.normal = mapface.plane.normal;
|
||||||
VectorScale(mapface.plane.normal, mapface.plane.dist, point);
|
point = mapface.plane.normal * mapface.plane.dist;
|
||||||
point -= rotate_offset;
|
point -= rotate_offset;
|
||||||
plane.dist = qv::dot(plane.normal, point);
|
plane.dist = qv::dot(plane.normal, point);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ face_t *NewFaceFromFace(face_t *in)
|
||||||
newf->lmshift[0] = in->lmshift[0];
|
newf->lmshift[0] = in->lmshift[0];
|
||||||
newf->lmshift[1] = in->lmshift[1];
|
newf->lmshift[1] = in->lmshift[1];
|
||||||
|
|
||||||
VectorCopy(in->origin, newf->origin);
|
newf->origin = in->origin;
|
||||||
newf->radius = in->radius;
|
newf->radius = in->radius;
|
||||||
|
|
||||||
return newf;
|
return newf;
|
||||||
|
|
@ -90,7 +90,7 @@ face_t *NewFaceFromFace(face_t *in)
|
||||||
|
|
||||||
void UpdateFaceSphere(face_t *in)
|
void UpdateFaceSphere(face_t *in)
|
||||||
{
|
{
|
||||||
VectorCopy(in->w.center(), in->origin);
|
in->origin = in->w.center();
|
||||||
in->radius = 0;
|
in->radius = 0;
|
||||||
for (size_t i = 0; i < in->w.size(); i++) {
|
for (size_t i = 0; i < in->w.size(); i++) {
|
||||||
in->radius = max(in->radius, qv::distance2(in->w[i], in->origin));
|
in->radius = max(in->radius, qv::distance2(in->w[i], in->origin));
|
||||||
|
|
|
||||||
16
qbsp/map.cc
16
qbsp/map.cc
|
|
@ -486,9 +486,9 @@ static void TextureAxisFromPlane(const qbsp_plane_t &plane, qvec3d &xv, qvec3d &
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorCopy(baseaxis[bestaxis * 3 + 1], xv);
|
xv = baseaxis[bestaxis * 3 + 1];
|
||||||
VectorCopy(baseaxis[bestaxis * 3 + 2], yv);
|
yv = baseaxis[bestaxis * 3 + 2];
|
||||||
VectorCopy(baseaxis[bestaxis * 3], snapped_normal);
|
snapped_normal = baseaxis[bestaxis * 3];
|
||||||
}
|
}
|
||||||
|
|
||||||
static quark_tx_info_t ParseExtendedTX(parser_t &parser)
|
static quark_tx_info_t ParseExtendedTX(parser_t &parser)
|
||||||
|
|
@ -1634,10 +1634,7 @@ static void ScaleMapFace(mapface_t *face, const qvec3d &scale)
|
||||||
|
|
||||||
std::array<qvec3d, 3> new_planepts;
|
std::array<qvec3d, 3> new_planepts;
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
qvec3d oldpt = face->planepts[i];
|
new_planepts[i] = scaleM * face->planepts[i];
|
||||||
qvec3d newpt = scaleM * oldpt;
|
|
||||||
|
|
||||||
VectorCopy(newpt, new_planepts[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
face->set_planepts(new_planepts);
|
face->set_planepts(new_planepts);
|
||||||
|
|
@ -1671,10 +1668,7 @@ static void RotateMapFace(mapface_t *face, const qvec3d &angles)
|
||||||
|
|
||||||
std::array<qvec3d, 3> new_planepts;
|
std::array<qvec3d, 3> new_planepts;
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
qvec3d oldpt = face->planepts[i];
|
new_planepts[i] = rotation * face->planepts[i];
|
||||||
qvec3d newpt = rotation * oldpt;
|
|
||||||
|
|
||||||
VectorCopy(newpt, new_planepts[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
face->set_planepts(new_planepts);
|
face->set_planepts(new_planepts);
|
||||||
|
|
|
||||||
|
|
@ -261,16 +261,15 @@ static void WriteLeakLine(const mapentity_t *leakentity, const std::vector<porta
|
||||||
{
|
{
|
||||||
std::ofstream ptsfile = InitPtsFile();
|
std::ofstream ptsfile = InitPtsFile();
|
||||||
|
|
||||||
qvec3d prevpt, currpt;
|
qvec3d prevpt = leakentity->origin;
|
||||||
VectorCopy(leakentity->origin, prevpt);
|
|
||||||
|
|
||||||
for (portal_t *portal : leakline) {
|
for (portal_t *portal : leakline) {
|
||||||
VectorCopy(portal->winding->center(), currpt);
|
qvec3d currpt = portal->winding->center();
|
||||||
|
|
||||||
// draw dots from prevpt to currpt
|
// draw dots from prevpt to currpt
|
||||||
WriteLeakTrail(ptsfile, prevpt, currpt);
|
WriteLeakTrail(ptsfile, prevpt, currpt);
|
||||||
|
|
||||||
VectorCopy(currpt, prevpt);
|
prevpt = currpt;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogPrint("Leak file written to {}\n", options.szBSPName);
|
LogPrint("Leak file written to {}\n", options.szBSPName);
|
||||||
|
|
|
||||||
|
|
@ -161,8 +161,8 @@ static wedge_t *FindEdge(const qvec3d &p1, const qvec3d &p2, vec_t &t1, vec_t &t
|
||||||
edge->next = wedge_hash[h];
|
edge->next = wedge_hash[h];
|
||||||
wedge_hash[h] = edge;
|
wedge_hash[h] = edge;
|
||||||
|
|
||||||
VectorCopy(origin, edge->origin);
|
edge->origin = origin;
|
||||||
VectorCopy(edgevec, edge->dir);
|
edge->dir = edgevec;
|
||||||
edge->head.next = edge->head.prev = &edge->head;
|
edge->head.next = edge->head.prev = &edge->head;
|
||||||
edge->head.t = VECT_MAX;
|
edge->head.t = VECT_MAX;
|
||||||
|
|
||||||
|
|
@ -289,8 +289,8 @@ restart:
|
||||||
/* rotate the point winding */
|
/* rotate the point winding */
|
||||||
qvec3d point0 = w[0];
|
qvec3d point0 = w[0];
|
||||||
for (i = 1; i < w.size(); i++)
|
for (i = 1; i < w.size(); i++)
|
||||||
VectorCopy(w[i], w[i - 1]);
|
w[i - 1] = w[i];
|
||||||
VectorCopy(point0, w[w.size() - 1]);
|
w[w.size() - 1] = point0;
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -358,7 +358,7 @@ restart:
|
||||||
superface->w.push_back({});
|
superface->w.push_back({});
|
||||||
|
|
||||||
for (int32_t k = superface->w.size() - 1; k > j; k--)
|
for (int32_t k = superface->w.size() - 1; k > j; k--)
|
||||||
VectorCopy(superface->w[k - 1], superface->w[k]);
|
superface->w[k] = superface->w[k - 1];
|
||||||
|
|
||||||
superface->w[j] = edge->origin + (edge->dir * v->t);
|
superface->w[j] = edge->origin + (edge->dir * v->t);
|
||||||
goto restart;
|
goto restart;
|
||||||
|
|
|
||||||
|
|
@ -177,10 +177,8 @@ static void ExportLeaf(mapentity_t *entity, node_t *node)
|
||||||
/*
|
/*
|
||||||
* write bounding box info
|
* write bounding box info
|
||||||
*/
|
*/
|
||||||
for (int32_t i = 0; i < 3; ++i) {
|
dleaf.mins = qv::floor(node->bounds.mins());
|
||||||
dleaf.mins[i] = floor(node->bounds.mins()[i]);
|
dleaf.maxs = qv::ceil(node->bounds.maxs());
|
||||||
dleaf.maxs[i] = ceil(node->bounds.maxs()[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
dleaf.visofs = -1; // no vis info yet
|
dleaf.visofs = -1; // no vis info yet
|
||||||
|
|
||||||
|
|
@ -218,11 +216,8 @@ static void ExportDrawNodes(mapentity_t *entity, node_t *node)
|
||||||
const size_t ourNodeIndex = map.bsp.dnodes.size();
|
const size_t ourNodeIndex = map.bsp.dnodes.size();
|
||||||
bsp2_dnode_t *dnode = &map.bsp.dnodes.emplace_back();
|
bsp2_dnode_t *dnode = &map.bsp.dnodes.emplace_back();
|
||||||
|
|
||||||
// VectorCopy doesn't work since dest are shorts
|
dnode->mins = qv::floor(node->bounds.mins());
|
||||||
for (int32_t i = 0; i < 3; ++i) {
|
dnode->maxs = qv::ceil(node->bounds.maxs());
|
||||||
dnode->mins[i] = floor(node->bounds.mins()[i]);
|
|
||||||
dnode->maxs[i] = ceil(node->bounds.maxs()[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
dnode->planenum = ExportMapPlane(node->planenum);
|
dnode->planenum = ExportMapPlane(node->planenum);
|
||||||
dnode->firstface = node->firstface;
|
dnode->firstface = node->firstface;
|
||||||
|
|
|
||||||
|
|
@ -63,13 +63,13 @@ static void ClipToSeparators(const std::shared_ptr<winding_t> &source, const qpl
|
||||||
// Make a plane with the three points
|
// Make a plane with the three points
|
||||||
v2 = pass->at(j) - source->at(i);
|
v2 = pass->at(j) - source->at(i);
|
||||||
sep.normal = qv::cross(v1, v2);
|
sep.normal = qv::cross(v1, v2);
|
||||||
len_sq = sep.normal[0] * sep.normal[0] + sep.normal[1] * sep.normal[1] + sep.normal[2] * sep.normal[2];
|
len_sq = qv::length2(sep.normal);
|
||||||
|
|
||||||
// If points don't make a valid plane, skip it.
|
// If points don't make a valid plane, skip it.
|
||||||
if (len_sq < ON_EPSILON)
|
if (len_sq < ON_EPSILON)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
VectorScale(sep.normal, 1.0 / sqrt(len_sq), sep.normal);
|
sep.normal *= (1.0 / sqrt(len_sq));
|
||||||
sep.dist = qv::dot(pass->at(j), sep.normal);
|
sep.dist = qv::dot(pass->at(j), sep.normal);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue