summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp
diff options
context:
space:
mode:
authordonkopunchstania <donkopunchstania@gmail.com>2010-01-11 00:44:40 +0000
committerdonkopunchstania <donkopunchstania@gmail.com>2010-01-11 00:44:40 +0000
commita19be73be32b3117719b201fbfd9f909df1a65ed (patch)
tree9a399c9f4e6d37a983d9d01b7ad31d92c60040a3 /Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp
parent175162e66170c0b66e152ddae7f8738facbe2f16 (diff)
Do special handling of texture coordinate generation if there is only a position and texture coordinate present.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4801 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp')
-rw-r--r--Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp56
1 files changed, 36 insertions, 20 deletions
diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp
index 38c1cc853f..b955d233e9 100644
--- a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp
+++ b/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp
@@ -109,7 +109,7 @@ void TransformNormal(const InputVertexData *src, bool nbt, OutputVertexData *dst
}
}
-inline void TransformTexCoordRegular(const TexMtxInfo &texinfo, int coordNum, const InputVertexData *srcVertex, OutputVertexData *dstVertex)
+inline void TransformTexCoordRegular(const TexMtxInfo &texinfo, int coordNum, bool specialCase, const InputVertexData *srcVertex, OutputVertexData *dstVertex)
{
const float *src;
switch (texinfo.sourcerow)
@@ -150,23 +150,39 @@ inline void TransformTexCoordRegular(const TexMtxInfo &texinfo, int coordNum, co
// normalize
const PostMtxInfo &postInfo = xfregs.postMtxInfo[coordNum];
- if (postInfo.normalize)
- {
- float length = sqrtf(dst[0] * dst[0] + dst[1] * dst[1] + dst[2] * dst[2]);
- float invL = 1.0f / length;
- tempCoord[0] = invL * dst[0];
- tempCoord[1] = invL * dst[1];
- tempCoord[2] = invL * dst[2];
- }
- else
- {
- tempCoord[0] = dst[0];
- tempCoord[1] = dst[1];
- tempCoord[2] = dst[2];
- }
-
- const float *postMat = (const float*)&xfregs.postMatrices[postInfo.index * 4];
- MultiplyVec3Mat34(tempCoord, postMat, dst);
+ const float *postMat = (const float*)&xfregs.postMatrices[postInfo.index * 4];
+
+ if (specialCase)
+ {
+ // no normalization
+ // q of input is 1
+ // q of output is unknown
+ tempCoord[0] = dst[0];
+ tempCoord[1] = dst[1];
+
+ dst[0] = postMat[0] * tempCoord[0] + postMat[1] * tempCoord[1] + postMat[2] + postMat[3];
+ dst[1] = postMat[4] * tempCoord[0] + postMat[5] * tempCoord[1] + postMat[6] + postMat[7];
+ dst[2] = 0.0f;
+ }
+ else
+ {
+ if (postInfo.normalize)
+ {
+ float length = sqrtf(dst[0] * dst[0] + dst[1] * dst[1] + dst[2] * dst[2]);
+ float invL = 1.0f / length;
+ tempCoord[0] = invL * dst[0];
+ tempCoord[1] = invL * dst[1];
+ tempCoord[2] = invL * dst[2];
+ }
+ else
+ {
+ tempCoord[0] = dst[0];
+ tempCoord[1] = dst[1];
+ tempCoord[2] = dst[2];
+ }
+
+ MultiplyVec3Mat34(tempCoord, postMat, dst);
+ }
}
}
@@ -443,7 +459,7 @@ void TransformColor(const InputVertexData *src, OutputVertexData *dst)
}
}
-void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst)
+void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool specialCase)
{
for (u32 coordNum = 0; coordNum < xfregs.numTexGens; coordNum++)
{
@@ -452,7 +468,7 @@ void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst)
switch (texinfo.texgentype)
{
case XF_TEXGEN_REGULAR:
- TransformTexCoordRegular(texinfo, coordNum, src, dst);
+ TransformTexCoordRegular(texinfo, coordNum, specialCase, src, dst);
break;
case XF_TEXGEN_EMBOSS_MAP:
{