BsD3D9EmulatedParamBlocks.cpp 1.8 KB

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