Store all matrices as column-major and transpose when needed

TRAC #11825 Due to the difference in [][] matrix indexing between GLSL and HLSL, all matrices are stored in transposed format (column-major from the HLSL point of view), and transposed back when performing matrix math. Previously some paths didn't follow this principle. Signed-off-by: Shannon Woods Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@138 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 47c058c3
......@@ -652,7 +652,6 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
case EOpVectorTimesScalarAssign: outputTriplet(visit, "(", " *= ", ")"); break;
case EOpMatrixTimesScalarAssign: outputTriplet(visit, "(", " *= ", ")"); break;
case EOpVectorTimesMatrixAssign:
case EOpMatrixTimesMatrixAssign:
if (visit == PreVisit)
{
out << "(";
......@@ -660,36 +659,30 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
else if (visit == InVisit)
{
out << " = mul(";
if (node->getLeft()->getQualifier() == EvqUniform)
{
out << "transpose(";
}
node->getLeft()->traverse(this);
if (node->getLeft()->getQualifier() == EvqUniform)
{
out << ")";
}
out << ", ";
if (node->getRight()->getQualifier() == EvqUniform)
{
out << "transpose(";
}
out << ", transpose(";
}
else
{
if (node->getRight()->getQualifier() == EvqUniform)
{
out << ")";
}
out << "))";
}
break;
case EOpMatrixTimesMatrixAssign:
if (visit == PreVisit)
{
out << "(";
}
else if (visit == InVisit)
{
out << " = mul(";
node->getLeft()->traverse(this);
out << ", ";
}
else
{
out << ")";
}
break;
case EOpDivAssign: outputTriplet(visit, "(", " /= ", ")"); break;
case EOpIndexDirect: outputTriplet(visit, NULL, "[", "]"); break;
case EOpIndexIndirect: outputTriplet(visit, NULL, "[", "]"); break;
......@@ -843,50 +836,9 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
case EOpGreaterThanEqual: outputTriplet(visit, "(", " >= ", ")"); break;
case EOpVectorTimesScalar: outputTriplet(visit, "(", " * ", ")"); break;
case EOpMatrixTimesScalar: outputTriplet(visit, "(", " * ", ")"); break;
case EOpVectorTimesMatrix:
if (node->getRight()->getQualifier() == EvqUniform)
{
outputTriplet(visit, "mul(", ", transpose(", "))");
}
else
{
outputTriplet(visit, "mul(", ", ", ")");
}
break;
case EOpMatrixTimesVector:
if (node->getLeft()->getQualifier() == EvqUniform)
{
outputTriplet(visit, "mul(transpose(", "), ", ")");
}
else
{
outputTriplet(visit, "mul(", ", ", ")");
}
break;
case EOpMatrixTimesMatrix:
if (node->getLeft()->getQualifier() == EvqUniform)
{
if (node->getRight()->getQualifier() == EvqUniform)
{
outputTriplet(visit, "mul(transpose(", "), transpose(", "))");
}
else
{
outputTriplet(visit, "mul(transpose(", "), ", ")");
}
}
else
{
if (node->getRight()->getQualifier() == EvqUniform)
{
outputTriplet(visit, "mul(", ", transpose(", "))");
}
else
{
outputTriplet(visit, "mul(", ", ", ")");
}
}
break;
case EOpVectorTimesMatrix: outputTriplet(visit, "mul(", ", transpose(", "))"); break;
case EOpMatrixTimesVector: outputTriplet(visit, "mul(transpose(", "), ", ")"); break;
case EOpMatrixTimesMatrix: outputTriplet(visit, "mul(", ", ", ")"); break;
case EOpLogicalOr: outputTriplet(visit, "(", " || ", ")"); break;
case EOpLogicalXor: outputTriplet(visit, "xor(", ", ", ")"); break; // FIXME: Prevent name clashes
case EOpLogicalAnd: outputTriplet(visit, "(", " && ", ")"); break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment