BsShaderEx.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Extensions/BsShaderEx.h"
  4. #include "CoreThread/BsCoreThread.h"
  5. namespace bs
  6. {
  7. Vector<ShaderParameter> ShaderEx::getParameters(const HShader& thisPtr)
  8. {
  9. if (!thisPtr.isLoaded())
  10. return Vector<ShaderParameter>();
  11. const Map<String, SHADER_DATA_PARAM_DESC>& dataParams = thisPtr->getDataParams();
  12. const Map<String, SHADER_OBJECT_PARAM_DESC>& textureParams = thisPtr->getTextureParams();
  13. const Map<String, SHADER_OBJECT_PARAM_DESC>& samplerParams = thisPtr->getSamplerParams();
  14. Vector<ShaderParameter> paramInfos;
  15. // TODO - Ignoring int, bool, struct and non-square matrices
  16. // TODO - Ignoring buffers and load/store textures
  17. for (auto& param : dataParams)
  18. {
  19. ShaderParameterType type;
  20. bool isValidType = false;
  21. bool isInternal = !param.second.rendererSemantic.empty();
  22. switch (param.second.type)
  23. {
  24. case GPDT_FLOAT1:
  25. type = ShaderParameterType::Float;
  26. isValidType = true;
  27. break;
  28. case GPDT_FLOAT2:
  29. type = ShaderParameterType::Vector2;
  30. isValidType = true;
  31. break;
  32. case GPDT_FLOAT3:
  33. type = ShaderParameterType::Vector3;
  34. isValidType = true;
  35. break;
  36. case GPDT_FLOAT4:
  37. type = ShaderParameterType::Vector4;
  38. isValidType = true;
  39. break;
  40. case GPDT_MATRIX_3X3:
  41. type = ShaderParameterType::Matrix3;
  42. isValidType = true;
  43. break;
  44. case GPDT_MATRIX_4X4:
  45. type = ShaderParameterType::Matrix4;
  46. isValidType = true;
  47. break;
  48. case GPDT_COLOR:
  49. type = ShaderParameterType::Color;
  50. isValidType = true;
  51. break;
  52. default:
  53. break;
  54. }
  55. if (isValidType)
  56. paramInfos.push_back({ param.first, type, isInternal });
  57. }
  58. for (auto& param : textureParams)
  59. {
  60. ShaderParameterType type;
  61. bool isValidType = false;
  62. bool isInternal = !param.second.rendererSemantic.empty();
  63. switch (param.second.type)
  64. {
  65. case GPOT_TEXTURE2D:
  66. case GPOT_TEXTURE2DMS:
  67. type = ShaderParameterType::Texture2D;
  68. isValidType = true;
  69. break;
  70. case GPOT_TEXTURE3D:
  71. type = ShaderParameterType::Texture3D;
  72. isValidType = true;
  73. break;
  74. case GPOT_TEXTURECUBE:
  75. type = ShaderParameterType::TextureCube;
  76. isValidType = true;
  77. break;
  78. default:
  79. break;
  80. }
  81. if (isValidType)
  82. paramInfos.push_back({ param.first, type, isInternal });
  83. }
  84. for (auto& param : samplerParams)
  85. {
  86. ShaderParameterType type = ShaderParameterType::Sampler;
  87. bool isInternal = !param.second.rendererSemantic.empty();
  88. paramInfos.push_back({ param.first, type, isInternal });
  89. }
  90. return paramInfos;
  91. }
  92. }