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; origin = bounds.mins() + radius;
this->radius = qv::length(radius); this->radius = qv::length(radius);
LMToTexCoordMatrix = qmat3x3f::row_major({ qmat4x4f LMToTexCoordMatrix = qmat4x4f::row_major({
lightmapshift, 0, lm_mins[0] * lightmapshift, lightmapshift, 0 , 0 , lm_mins[0] * lightmapshift,
0 , lightmapshift, lm_mins[1] * lightmapshift, 0 , lightmapshift, 0 , lm_mins[1] * lightmapshift,
0 , 0 , 1 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 int faceextents_t::width() const
@ -756,25 +760,11 @@ int faceextents_t::numsamples() const
return width() * height(); return width() * height();
} }
qvec2i faceextents_t::texsize() const qvec2i faceextents_t::lmsize() const
{ {
return {width(), height()}; 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 qvec2f faceextents_t::worldToTexCoord(qvec3f world) const
{ {
const qvec4f worldPadded(world, 1.0f); const qvec4f worldPadded(world, 1.0f);
@ -797,10 +787,14 @@ qvec3f faceextents_t::texCoordToWorld(qvec2f tc) const
qvec2f faceextents_t::worldToLMCoord(qvec3f world) 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 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; qvec2i lm_extents;
qmat4x4f worldToTexCoordMatrix; qmat4x4f worldToTexCoordMatrix;
qmat4x4f texCoordToWorldMatrix; qmat4x4f texCoordToWorldMatrix;
qmat3x3f LMToTexCoordMatrix; qmat4x4f lmToWorldMatrix;
qmat3x3f TexCoordToLMMatrix; qmat4x4f worldToLMMatrix;
public: public:
qvec3d origin; qvec3d origin;
@ -141,9 +141,7 @@ public:
int width() const; int width() const;
int height() const; int height() const;
int numsamples() const; int numsamples() const;
qvec2i texsize() const; qvec2i lmsize() const;
qvec2f lightmapCoordToTexCoord(const qvec2f &LMCoord) const;
qvec2f texCoordToLightmapCoord(const qvec2f &tc) const;
qvec2f worldToTexCoord(qvec3f world) const; qvec2f worldToTexCoord(qvec3f world) const;
qvec3f texCoordToWorld(qvec2f tc) const; qvec3f texCoordToWorld(qvec2f tc) const;
qvec2f worldToLMCoord(qvec3f world) const; qvec2f worldToLMCoord(qvec3f world) const;