bool ScalarizeVecAndMatConstructorArgs::visitAggregate(Visit visit, TIntermAggregate *node) { if (visit == PreVisit) { switch (node->getOp()) { case EOpSequence: mSequenceStack.push_back(TIntermSequence()); { for (TIntermSequence::const_iterator iter = node->getSequence()->begin(); iter != node->getSequence()->end(); ++iter) { TIntermNode *child = *iter; ASSERT(child != NULL); child->traverse(this); mSequenceStack.back().push_back(child); } } if (mSequenceStack.back().size() > node->getSequence()->size()) { node->getSequence()->clear(); *(node->getSequence()) = mSequenceStack.back(); } mSequenceStack.pop_back(); return false; case EOpConstructVec2: case EOpConstructVec3: case EOpConstructVec4: case EOpConstructBVec2: case EOpConstructBVec3: case EOpConstructBVec4: case EOpConstructIVec2: case EOpConstructIVec3: case EOpConstructIVec4: if (ContainsMatrixNode(*(node->getSequence()))) scalarizeArgs(node, false, true); break; case EOpConstructMat2: case EOpConstructMat3: case EOpConstructMat4: if (ContainsVectorNode(*(node->getSequence()))) scalarizeArgs(node, true, false); break; default: break; } } return true; }
bool ScalarizeVecAndMatConstructorArgs::visitAggregate(Visit visit, TIntermAggregate *node) { if (visit == PreVisit) { switch (node->getOp()) { case EOpConstructVec2: case EOpConstructVec3: case EOpConstructVec4: case EOpConstructBVec2: case EOpConstructBVec3: case EOpConstructBVec4: case EOpConstructIVec2: case EOpConstructIVec3: case EOpConstructIVec4: if (ContainsMatrixNode(*(node->getSequence()))) scalarizeArgs(node, false, true); break; case EOpConstructMat2: case EOpConstructMat2x3: case EOpConstructMat2x4: case EOpConstructMat3x2: case EOpConstructMat3: case EOpConstructMat3x4: case EOpConstructMat4x2: case EOpConstructMat4x3: case EOpConstructMat4: if (ContainsVectorNode(*(node->getSequence()))) scalarizeArgs(node, true, false); break; default: break; } } return true; }