faceextents_t: refactor to store world <-> lm matrices rather than tex space <-> lm

This commit is contained in:
Eric Wasylishen 2022-11-02 09:39:20 -06:00
parent 1f01b65873
commit eb2d697cef
2 changed files with 19 additions and 27 deletions

View File

@ -733,12 +733,16 @@ faceextents_t::faceextents_t(const mface_t &face, const mbsp_t &bsp, float light
origin = bounds.mins() + radius;
this->radius = qv::length(radius);
LMToTexCoordMatrix = qmat3x3f::row_major({
lightmapshift, 0, lm_mins[0] * lightmapshift,
0 , lightmapshift, lm_mins[1] * lightmapshift,
0 , 0 , 1
qmat4x4f LMToTexCoordMatrix = qmat4x4f::row_major({
lightmapshift, 0 , 0 , lm_mins[0] * lightmapshift,
0 , lightmapshift, 0 , lm_mins[1] * lightmapshift,
0 , 0 , 1 , 0,
0 , 0 , 0 , 1
});
TexCoordToLMMatrix = qv::inverse(LMToTexCoordMatrix);
qmat4x4f TexCoordToLMMatrix = qv::inverse(LMToTexCoordMatrix);
lmToWorldMatrix = texCoordToWorldMatrix * LMToTexCoordMatrix;
worldToLMMatrix = TexCoordToLMMatrix * worldToTexCoordMatrix;
}
int faceextents_t::width() const
@ -756,25 +760,11 @@ int faceextents_t::numsamples() const
return width() * height();
}
qvec2i faceextents_t::texsize() const
qvec2i faceextents_t::lmsize() const
{
return {width(), height()};
}
qvec2f faceextents_t::lightmapCoordToTexCoord(const qvec2f &LMCoord) const
{
qvec3f LMCoordPadded = {LMCoord[0], LMCoord[1], 1.0f};
qvec2f tex = LMToTexCoordMatrix * LMCoordPadded;
return tex;
}
qvec2f faceextents_t::texCoordToLightmapCoord(const qvec2f &tc) const
{
qvec3f tcPadded = {tc[0], tc[1], 1.0f};
qvec2f lm = TexCoordToLMMatrix * tcPadded;
return lm;
}
qvec2f faceextents_t::worldToTexCoord(qvec3f world) const
{
const qvec4f worldPadded(world, 1.0f);
@ -797,10 +787,14 @@ qvec3f faceextents_t::texCoordToWorld(qvec2f tc) const
qvec2f faceextents_t::worldToLMCoord(qvec3f world) const
{
return texCoordToLightmapCoord(worldToTexCoord(world));
const qvec4f worldPadded(world, 1.0f);
const qvec4f res = worldToLMMatrix * worldPadded;
return res;
}
qvec3f faceextents_t::LMCoordToWorld(qvec2f lm) const
{
return texCoordToWorld(lightmapCoordToTexCoord(lm));
const qvec4f lmPadded(lm[0], lm[1], 0.0f, 1.0f);
const qvec4f res = lmToWorldMatrix * lmPadded;
return res;
}

View File

@ -126,8 +126,8 @@ private:
qvec2i lm_extents;
qmat4x4f worldToTexCoordMatrix;
qmat4x4f texCoordToWorldMatrix;
qmat3x3f LMToTexCoordMatrix;
qmat3x3f TexCoordToLMMatrix;
qmat4x4f lmToWorldMatrix;
qmat4x4f worldToLMMatrix;
public:
qvec3d origin;
@ -141,9 +141,7 @@ public:
int width() const;
int height() const;
int numsamples() const;
qvec2i texsize() const;
qvec2f lightmapCoordToTexCoord(const qvec2f &LMCoord) const;
qvec2f texCoordToLightmapCoord(const qvec2f &tc) const;
qvec2i lmsize() const;
qvec2f worldToTexCoord(qvec3f world) const;
qvec3f texCoordToWorld(qvec2f tc) const;
qvec2f worldToLMCoord(qvec3f world) const;