BsD3D9EmulatedParamBlocks.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "BsD3D9EmulatedParamBlocks.h"
  2. #include <regex>
  3. namespace BansheeEngine
  4. {
  5. String D3D9EmulatedParamBlockParser::parse(const String& gpuProgSource, Vector<D3D9EmulatedParamBlock>& paramBlocks)
  6. {
  7. static std::regex paramBlockRegex("BS_PARAM_BLOCK\\s*(.*\\})");
  8. static std::regex blockNameRegex("([^\\s\\{]*)");
  9. static std::regex paramNameRegex("(?:\\{ *([^\\, ]*))|(?:\\, *([^\\, \\}]*))");
  10. static std::regex replaceRegex("BS_PARAM_BLOCK\\s*(.*\\}\\n?)");
  11. std::sregex_iterator paramBlockIter(gpuProgSource.begin(), gpuProgSource.end(), paramBlockRegex);
  12. std::sregex_iterator iterEnd;
  13. while (paramBlockIter != iterEnd)
  14. {
  15. std::string stdString = (*paramBlockIter)[1];
  16. String paramBlockString = String(stdString.begin(), stdString.end());
  17. paramBlocks.push_back(D3D9EmulatedParamBlock());
  18. D3D9EmulatedParamBlock& block = paramBlocks.back();
  19. std::smatch nameMatch;
  20. if (std::regex_search(paramBlockString, nameMatch, blockNameRegex))
  21. {
  22. stdString = nameMatch[1];
  23. block.blockName = String(stdString.begin(), stdString.end());
  24. }
  25. std::sregex_iterator paramNameIter(paramBlockString.begin(), paramBlockString.end(), paramNameRegex);
  26. while (paramNameIter != iterEnd)
  27. {
  28. if((*paramNameIter)[1].matched)
  29. stdString = (*paramNameIter)[1];
  30. else
  31. stdString = (*paramNameIter)[2];
  32. block.paramNames.push_back(String(stdString.begin(), stdString.end()));
  33. ++paramNameIter;
  34. }
  35. ++paramBlockIter;
  36. }
  37. // Return string without param block definitions
  38. return std::regex_replace(gpuProgSource, replaceRegex, "");
  39. }
  40. }