no more Vector!

This commit is contained in:
Jonathan 2021-10-25 10:38:15 -04:00
parent e1695ebfd3
commit e0ed70cc87
14 changed files with 87 additions and 135 deletions

View File

@ -326,7 +326,7 @@ template<typename T, typename U, typename L = std::common_type_t<typename T::val
}
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;
for (size_t i = 0; i < N; i++) {
@ -336,7 +336,17 @@ 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;
for (size_t i = 0; i < N; i++) {
@ -388,11 +398,7 @@ template<size_t N, class T>
template<size_t N, class T>
[[nodiscard]] constexpr T length2(const qvec<T, N> &v1)
{
T len2 = 0;
for (size_t i = 0; i < N; i++) {
len2 += (v1[i] * v1[i]);
}
return len2;
return qv::dot(v1, v1);
}
template<size_t N, class T>
@ -873,29 +879,6 @@ namespace qv
[[nodiscard]] qmat2x2f inverse(const qmat2x2f &input);
}; // 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 distance from `start` to `stop`
template<typename Tstart, typename Tstop, typename Tdir>

View File

@ -259,8 +259,8 @@ private:
{
// apply transform
switch (_transformer) {
case vec3_transformer_t::NONE: VectorCopy(val, out); break;
case vec3_transformer_t::MANGLE_TO_VEC: VectorCopy(vec_from_mangle(val), out); break;
case vec3_transformer_t::NONE: out = val; break;
case vec3_transformer_t::MANGLE_TO_VEC: out = vec_from_mangle(val); break;
case vec3_transformer_t::NORMALIZE_COLOR_TO_255:
out = val;
normalize_color_format(out);

View File

@ -65,7 +65,7 @@ static unique_ptr<patch_t> MakePatch(const mbsp_t *bsp, const globalconfig_t &cf
p->w = std::move(w);
// cache some stuff
VectorCopy(&p->w.center()[0], p->center);
p->center = p->w.center();
p->plane = p->w.plane();
// nudge the cernter point 1 unit off

View File

@ -432,7 +432,7 @@ static void SetupSun(const globalconfig_t &cfg, vec_t light, const qvec3d &color
/* calculate sun direction */
if (i == 0) {
VectorCopy(sunvec, direction);
direction = sunvec;
} else {
vec_t da, de;
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);
if (entity.mangle.isChanged()) {
const qvec3f temp = vec_from_mangle(entity.mangle.vec3Value());
VectorCopy(temp, entity.spotvec);
entity.spotvec = vec_from_mangle(entity.mangle.vec3Value());
entity.spotlight = true;
if (!entity.projangle.isChanged()) {
@ -1352,7 +1351,7 @@ static void SubdividePolygon(const mface_t *face, const modelinfo_t *face_modeli
// wrap cases
dist[j] = dist[0];
v -= i;
VectorCopy(verts, v);
v = verts;
f = b = 0;
v = verts;

View File

@ -677,11 +677,8 @@ static void CalcPoints(
surf->occluded[i] = !res.m_unoccluded;
*realfacenum = res.m_actualFace != nullptr ? Face_GetNum(bsp, res.m_actualFace) : -1;
VectorCopy(res.m_position, point);
VectorCopy(res.m_interpolatedNormal, norm);
// apply model offset after calling CalcPointNormal
point += offset;
point = res.m_position + offset;
norm = res.m_interpolatedNormal;
}
}
@ -745,17 +742,17 @@ static bool Lightsurf_Init(
}
/* Set up the plane, not including model offset */
qplane3d *plane = &lightsurf->plane;
VectorCopy(bsp->dplanes[face->planenum].normal, plane->normal);
plane->dist = bsp->dplanes[face->planenum].dist;
qplane3d &plane = lightsurf->plane;
if (face->side) {
*plane = -*plane;
plane = -bsp->dplanes[face->planenum];
} else {
plane = bsp->dplanes[face->planenum];
}
/* Set up the texorg for coordinate transformation */
lightsurf->texorg.texSpaceToWorld = TexSpaceToWorld(bsp, face);
lightsurf->texorg.texinfo = &bsp->texinfo[face->texinfo];
lightsurf->texorg.planedist = plane->dist;
lightsurf->texorg.planedist = plane.dist;
/* Check for invalid texture axes */
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,
calculation of face extents / points needs the uncorrected plane) */
qvec3d planepoint = (plane->normal * plane->dist) + modelinfo->offset;
plane->dist = qv::dot(plane->normal, planepoint);
qvec3d planepoint = (plane.normal * plane.dist) + modelinfo->offset;
plane.dist = qv::dot(plane.normal, planepoint);
/* Correct bounding sphere */
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);
}
VectorScale(col, add * (1.0f / 255.0f), color_out);
color_out = col * add * (1.0f / 255.0f);
} 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
VectorScale(surfpointToLightDir_out, add, normalmap_addition_out);
normalmap_addition_out = surfpointToLightDir_out * add;
*dist_out = dist;
}
@ -1255,10 +1252,8 @@ std::map<int, qvec3f> GetDirectLighting(
continue;
// Write out the final color
qvec3d color;
VectorScale(
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);
// color_out is expected to be in [0..255] range, vpl->color is in [0..1] range.
qvec3d color = (vpl.color * add) * cfg.surflightbouncescale.floatValue();
// NOTE: Skip negative lights, which would make no sense to bounce!
if (LightSample_Brightness(color) <= fadegate)
@ -1287,7 +1282,7 @@ std::map<int, qvec3f> GetDirectLighting(
GetLightContrib(
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!
if (LightSample_Brightness(color) <= fadegate) {
@ -1409,7 +1404,7 @@ static void LightFace_Entity(
const float occlusion =
Dirt_GetScaleFactor(cfg, lightsurf->occlusion[i], entity, surfpointToLightDist, lightsurf);
VectorScale(color, occlusion, color);
color *= occlusion;
/* Quick distance check first */
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);
}
qvec3d color, normalcontrib;
VectorScale(sun->sunlight_color, value / 255.0, color);
VectorScale(sun->sunvec, value, normalcontrib);
qvec3d color = sun->sunlight_color * (value / 255.0);
/* Quick distance check first */
if (fabs(LightSample_Brightness(color)) <= fadegate) {
continue;
}
qvec3d normalcontrib = sun->sunvec * value;
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);
lightsample_t *sample = &lightmap->samples[i];
VectorCopy(patch_color, sample->color);
sample->color = patch_color;
Lightmap_Save(lightmaps, lightsurf, lightmap, styleColor.first);
}
}
@ -1950,18 +1945,13 @@ static void LightFace_Bounce(
continue; // FIXME: nudge or something
dir /= dist;
const qvec3f indirect =
const qvec3d indirect =
GetIndirectLighting(cfg, &vpl, color, dir, dist, lightsurf->points[i], lightsurf->normals[i]);
if (LightSample_Brightness(indirect) < 0.25)
continue;
qvec3d vplPos, vplDir, vplColor;
VectorCopy(vpl.pos, vplPos);
VectorCopy(dir, vplDir);
VectorCopy(indirect, vplColor);
rs->pushRay(i, vplPos, vplDir, dist, &vplColor);
rs->pushRay(i, vpl.pos, dir, dist, &indirect);
}
if (!rs->numPushedRays())
@ -1987,7 +1977,7 @@ static void LightFace_Bounce(
*/
if (debugmode != debugmode_bounce) {
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];
@ -2094,10 +2084,7 @@ static void LightFace_Bounce(
colorAvg /= Nhits;
lightsample_t *sample = &lightmap->samples[i];
qvec3d indirectTmp;
VectorCopy(colorAvg, indirectTmp);
sample->color += indirectTmp;
sample->color += colorAvg;
}
}
@ -2138,7 +2125,7 @@ LightFace_SurfaceLight(const lightsurf_t *lightsurf, lightmapdict_t *lightmaps)
else
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
continue;
@ -2152,12 +2139,7 @@ LightFace_SurfaceLight(const lightsurf_t *lightsurf, lightmapdict_t *lightmaps)
else
dir /= dist;
qvec3d vplPos, vplDir, vplColor;
VectorCopy(pos, vplPos);
VectorCopy(dir, vplDir);
VectorCopy(indirect, vplColor);
rs->pushRay(i, vplPos, vplDir, dist, &vplColor);
rs->pushRay(i, pos, dir, dist, &indirect);
}
if (!rs->numPushedRays())
@ -2182,7 +2164,7 @@ LightFace_SurfaceLight(const lightsurf_t *lightsurf, lightmapdict_t *lightmaps)
// Use dirt scaling on the surface lighting.
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];
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++) {
lightsample_t *sample = &lightmap->samples[i];
if (lightsurf->occluded[i]) {
VectorCopy(qvec3f(255, 0, 0), sample->color);
sample->color = { 255, 0, 0 };
} 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
lightsurf->occluded[i] = false;
@ -2248,12 +2230,12 @@ static void LightFace_DebugNeighbours(lightsurf_t *lightsurf, lightmapdict_t *li
if (sample_face == dump_facenum) {
/* 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) {
/* Green - the face has some samples on the selected face */
VectorCopy(qvec3f(0, 255, 0), sample->color);
sample->color = { 0, 255, 0 };
} 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
lightsurf->occluded[i] = false;
@ -2508,7 +2490,7 @@ static void LightFace_ScaleAndClamp(const lightsurf_t *lightsurf, lightmapdict_t
color = qv::max(color, {0});
/* Scale and clamp any out-of-range samples */
VectorScale(color, cfg.rangescale.floatValue(), color);
color *= cfg.rangescale.floatValue();
for (auto &c : color) {
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);
if (maxcolor > 255) {
VectorScale(color, 255.0f / maxcolor, color);
color *= (255.0f / maxcolor);
}
}
}

View File

@ -125,11 +125,11 @@ static void *MakeSurfaceLightsThread(void *arg)
// 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
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...
float intensity = qv::max(texturecolor);
@ -139,7 +139,7 @@ static void *MakeSurfaceLightsThread(void *arg)
// Normalize color...
if (intensity > 1.0f)
VectorScale(texturecolor, 1.0f / intensity, texturecolor);
texturecolor *= 1.0f / intensity;
// Sanity checks...
Q_assert(!points.empty());
@ -149,12 +149,12 @@ static void *MakeSurfaceLightsThread(void *arg)
l.surfnormal = facenormal;
l.omnidirectional = (info->flags.native & Q2_SURF_SKY) ? true : false;
l.points = points;
VectorCopy(facemidpoint, l.pos);
l.pos = facemidpoint;
// Store surfacelight settings...
l.totalintensity = intensity * facearea;
l.intensity = l.totalintensity / points.size();
VectorCopy(texturecolor, l.color);
l.color = texturecolor;
// Init bbox...
l.bounds = qvec3d(0);

View File

@ -850,10 +850,10 @@ public:
_rays_maxdist[_numrays] = dist;
_point_indices[_numrays] = i;
if (color) {
VectorCopy(*color, _ray_colors[_numrays]);
_ray_colors[_numrays] = *color;
}
if (normalcontrib) {
VectorCopy(*normalcontrib, _ray_normalcontribs[_numrays]);
_ray_normalcontribs[_numrays] = *normalcontrib;
}
_ray_dynamic_styles[_numrays] = 0;
_numrays++;
@ -933,10 +933,10 @@ public:
_rays_maxdist[_numrays] = dist;
_point_indices[_numrays] = i;
if (color) {
VectorCopy(*color, _ray_colors[_numrays]);
_ray_colors[_numrays] = *color;
}
if (normalcontrib) {
VectorCopy(*normalcontrib, _ray_normalcontribs[_numrays]);
_ray_normalcontribs[_numrays] = *normalcontrib;
}
_ray_dynamic_styles[_numrays] = 0;
_numrays++;

View File

@ -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,
length, p1[0], p1[1], p1[2]);
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);
CheckFace(face, sourceface);
break;
@ -378,8 +378,8 @@ static face_t *CreateBrushFaces(const mapentity_t *src, hullbrush_t *hullbrush,
mapface.texinfo = FindTexinfo(texInfoNew);
}
VectorCopy(mapface.plane.normal, plane.normal);
VectorScale(mapface.plane.normal, mapface.plane.dist, point);
plane.normal = mapface.plane.normal;
point = mapface.plane.normal * mapface.plane.dist;
point -= rotate_offset;
plane.dist = qv::dot(plane.normal, point);

View File

@ -82,7 +82,7 @@ face_t *NewFaceFromFace(face_t *in)
newf->lmshift[0] = in->lmshift[0];
newf->lmshift[1] = in->lmshift[1];
VectorCopy(in->origin, newf->origin);
newf->origin = in->origin;
newf->radius = in->radius;
return newf;
@ -90,7 +90,7 @@ face_t *NewFaceFromFace(face_t *in)
void UpdateFaceSphere(face_t *in)
{
VectorCopy(in->w.center(), in->origin);
in->origin = in->w.center();
in->radius = 0;
for (size_t i = 0; i < in->w.size(); i++) {
in->radius = max(in->radius, qv::distance2(in->w[i], in->origin));

View File

@ -486,9 +486,9 @@ static void TextureAxisFromPlane(const qbsp_plane_t &plane, qvec3d &xv, qvec3d &
}
}
VectorCopy(baseaxis[bestaxis * 3 + 1], xv);
VectorCopy(baseaxis[bestaxis * 3 + 2], yv);
VectorCopy(baseaxis[bestaxis * 3], snapped_normal);
xv = baseaxis[bestaxis * 3 + 1];
yv = baseaxis[bestaxis * 3 + 2];
snapped_normal = baseaxis[bestaxis * 3];
}
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;
for (int i = 0; i < 3; i++) {
qvec3d oldpt = face->planepts[i];
qvec3d newpt = scaleM * oldpt;
VectorCopy(newpt, new_planepts[i]);
new_planepts[i] = scaleM * face->planepts[i];
}
face->set_planepts(new_planepts);
@ -1671,10 +1668,7 @@ static void RotateMapFace(mapface_t *face, const qvec3d &angles)
std::array<qvec3d, 3> new_planepts;
for (int i = 0; i < 3; i++) {
qvec3d oldpt = face->planepts[i];
qvec3d newpt = rotation * oldpt;
VectorCopy(newpt, new_planepts[i]);
new_planepts[i] = rotation * face->planepts[i];
}
face->set_planepts(new_planepts);

View File

@ -261,16 +261,15 @@ static void WriteLeakLine(const mapentity_t *leakentity, const std::vector<porta
{
std::ofstream ptsfile = InitPtsFile();
qvec3d prevpt, currpt;
VectorCopy(leakentity->origin, prevpt);
qvec3d prevpt = leakentity->origin;
for (portal_t *portal : leakline) {
VectorCopy(portal->winding->center(), currpt);
qvec3d currpt = portal->winding->center();
// draw dots from prevpt to currpt
WriteLeakTrail(ptsfile, prevpt, currpt);
VectorCopy(currpt, prevpt);
prevpt = currpt;
}
LogPrint("Leak file written to {}\n", options.szBSPName);

View File

@ -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];
wedge_hash[h] = edge;
VectorCopy(origin, edge->origin);
VectorCopy(edgevec, edge->dir);
edge->origin = origin;
edge->dir = edgevec;
edge->head.next = edge->head.prev = &edge->head;
edge->head.t = VECT_MAX;
@ -289,8 +289,8 @@ restart:
/* rotate the point winding */
qvec3d point0 = w[0];
for (i = 1; i < w.size(); i++)
VectorCopy(w[i], w[i - 1]);
VectorCopy(point0, w[w.size() - 1]);
w[i - 1] = w[i];
w[w.size() - 1] = point0;
goto restart;
}
@ -358,7 +358,7 @@ restart:
superface->w.push_back({});
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);
goto restart;

View File

@ -177,10 +177,8 @@ static void ExportLeaf(mapentity_t *entity, node_t *node)
/*
* write bounding box info
*/
for (int32_t i = 0; i < 3; ++i) {
dleaf.mins[i] = floor(node->bounds.mins()[i]);
dleaf.maxs[i] = ceil(node->bounds.maxs()[i]);
}
dleaf.mins = qv::floor(node->bounds.mins());
dleaf.maxs = qv::ceil(node->bounds.maxs());
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();
bsp2_dnode_t *dnode = &map.bsp.dnodes.emplace_back();
// VectorCopy doesn't work since dest are shorts
for (int32_t i = 0; i < 3; ++i) {
dnode->mins[i] = floor(node->bounds.mins()[i]);
dnode->maxs[i] = ceil(node->bounds.maxs()[i]);
}
dnode->mins = qv::floor(node->bounds.mins());
dnode->maxs = qv::ceil(node->bounds.maxs());
dnode->planenum = ExportMapPlane(node->planenum);
dnode->firstface = node->firstface;

View File

@ -63,13 +63,13 @@ static void ClipToSeparators(const std::shared_ptr<winding_t> &source, const qpl
// Make a plane with the three points
v2 = pass->at(j) - source->at(i);
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 (len_sq < ON_EPSILON)
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);
//