BsD3D9EmulatedParamBlocks.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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->str();
  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.str();
  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. stdString = paramNameIter->str();
  29. block.paramNames.push_back(String(stdString.begin(), stdString.end()));
  30. }
  31. paramBlockIter++;
  32. }
  33. // Return string without param block definitions
  34. return std::regex_replace(gpuProgSource, replaceRegex, "");
  35. }
  36. }