CustomMaterial.hpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. //
  2. // CustomMaterial.hpp
  3. // building
  4. //
  5. // Created by yanqian on 2023/5/8.
  6. //
  7. #ifndef CustomMaterial_hpp
  8. #define CustomMaterial_hpp
  9. #include "cocos2d.h"
  10. #include "renderer/CCMaterial.h"
  11. NS_CC_BEGIN
  12. // float类型参数
  13. struct UniformParamFloat {
  14. std::string name;
  15. float value;
  16. UniformParamFloat(const std::string& aname, const float& avalue) : name(aname), value(avalue) { }
  17. };
  18. // Vec2类型参数
  19. struct UniformParamVec2 {
  20. std::string name;
  21. Vec2 value;
  22. UniformParamVec2(const std::string& aname, const Vec2& avalue) : name(aname), value(avalue) { }
  23. };
  24. // Vec3类型参数
  25. struct UniformParamVec3 {
  26. std::string name;
  27. Vec3 value;
  28. UniformParamVec3(const std::string& aname, const Vec3& avalue) : name(aname), value(avalue) { }
  29. };
  30. // Vec3类型参数
  31. struct UniformParamVec4 {
  32. std::string name;
  33. Vec4 value;
  34. UniformParamVec4(const std::string& aname, const Vec4& avalue) : name(aname), value(avalue) { }
  35. };
  36. // Mat4类型参数
  37. struct UniformParamMat4 {
  38. std::string name;
  39. Mat4 value;
  40. UniformParamMat4(const std::string& aname, const Mat4& avalue) : name(aname), value(avalue) { }
  41. };
  42. // string类型参数
  43. struct UniformParamString {
  44. std::string name;
  45. std::string value;
  46. UniformParamString(const std::string& aname, const std::string& avalue) : name(aname), value(avalue) { }
  47. };
  48. // 纹理类型参数
  49. struct UniformParamTexture {
  50. std::string name;
  51. Texture2D::TexParams texParams;
  52. UniformParamTexture(const std::string& aname, const Texture2D::TexParams& atexParams) : name(aname), texParams(atexParams) { }
  53. };
  54. class Technique;
  55. class Pass;
  56. class CustomMaterial : public Material {
  57. public:
  58. CustomMaterial();
  59. virtual ~CustomMaterial();
  60. /**
  61. * 根据配置文件创建一个材质
  62. * @param path 材质文件的路径
  63. * @return CustomMaterial 材质对象
  64. */
  65. static CustomMaterial* createWithFilename(const std::string& path);
  66. /**
  67. * 每帧进行time累加
  68. */
  69. virtual void updateUniformTime(float delta);
  70. /**
  71. * 获取材质的 float 类型参数列表
  72. */
  73. const std::vector<UniformParamFloat> getParamsFloat();
  74. /**
  75. * 获取材质的 Vec2 类型参数列表
  76. */
  77. const std::vector<UniformParamVec2> getParamsVec2();
  78. /**
  79. * 获取材质的 Vec3 类型参数列表
  80. */
  81. const std::vector<UniformParamVec3> getParamsVec3();
  82. /**
  83. * 获取材质的 Vec4 类型参数列表
  84. */
  85. const std::vector<UniformParamVec4> getParamsVec4();
  86. /**
  87. * 获取材质的 Mat4 类型参数列表
  88. */
  89. const std::vector<UniformParamMat4> getParamsMat4();
  90. /**
  91. * 获取材质的 string 类型参数列表
  92. */
  93. const std::vector<UniformParamString> getParamsString();
  94. /**
  95. * 设置材质的 float 类型参数
  96. * @param name 参数名
  97. * @param value 参数值
  98. */
  99. void setParamFloat(std::string name, float value);
  100. /**
  101. * 设置材质的 Vec2 类型参数
  102. * @param name 参数名
  103. * @param value 参数值
  104. */
  105. void setParamsVec2(std::string name, Vec2 value);
  106. /**
  107. * 设置材质的 Vec3 类型参数
  108. * @param name 参数名
  109. * @param value 参数值
  110. */
  111. void setParamsVec3(std::string name, Vec3 value);
  112. /**
  113. * 设置材质的 Vec4 类型参数
  114. * @param name 参数名
  115. * @param value 参数值
  116. */
  117. void setParamsVec4(std::string name, Vec4 value);
  118. /**
  119. * 设置材质的 Mat4 类型参数
  120. * @param name 参数名
  121. * @param value 参数值
  122. */
  123. void setParamsMat4(std::string name, Mat4 value);
  124. /**
  125. * 设置材质的 string 类型参数
  126. * @param name 参数名
  127. * @param value 参数值
  128. */
  129. void setParamsString(std::string name, std::string value);
  130. /**
  131. * 设置材质的纹理参数
  132. * @param spriteFrame 纹理
  133. */
  134. void setParamsTexture(SpriteFrame* spriteFrame);
  135. /**
  136. * 获取材质文件的相对路径
  137. */
  138. std::string getMaterialPath();
  139. /**
  140. * 设置材质文件的相对路径
  141. */
  142. void setMaterialPath(std::string materialPath);
  143. /**
  144. * 是否要使用混合函数
  145. */
  146. bool useBlendFunc();
  147. /**
  148. * 获取混合函数
  149. */
  150. BlendFunc getBlendFunc();
  151. protected:
  152. /**
  153. * 通过材质的配置文件初始化一个材质对象
  154. * @param file 材质文件
  155. */
  156. bool initWithFile(const std::string& file);
  157. /**
  158. * 解析材质属性
  159. */
  160. bool parseProperties(Properties* properties);
  161. /**
  162. * 解析材质中的technique属性
  163. */
  164. bool parseTechnique(Properties* properties);
  165. /**
  166. * 解析材质中的pass属性
  167. */
  168. bool parsePass(Technique* technique, Properties* properties);
  169. /**
  170. * 解析材质中的shader
  171. */
  172. bool parseShader(Pass* pass, Properties* properties);
  173. /**
  174. * 解析材质中的混合模式
  175. */
  176. bool parseRenderState(RenderState* renderState, Properties* properties);
  177. /**
  178. * 解析混合函数
  179. */
  180. int _parseBlend(const std::string& value);
  181. /**
  182. * 解析材质中的纹理
  183. */
  184. bool parseSampler(GLProgramState* glProgramState, Properties* properties);
  185. /**
  186. * 解析editorUniform
  187. */
  188. bool _parseEditorUniform(Properties* paramsProperties);
  189. /**
  190. * 解析并设置uniform变量
  191. */
  192. bool _parseUniformParams(GLProgramState* programState, Properties* paramsProperties);
  193. /**
  194. * 获取one pass 的programState
  195. */
  196. GLProgramState* _getGLProgramState();
  197. /**
  198. * 设置材质文件的相对路径的前缀
  199. */
  200. void setRelativePath(std::string relativePath);
  201. /**
  202. * 获取材质文件的相对路径的前缀
  203. */
  204. std::string getRelativePath();
  205. private:
  206. std::vector<UniformParamFloat> _paramFloat; // float类型的uniform参数列表
  207. std::vector<UniformParamVec2> _paramVec2;
  208. std::vector<UniformParamVec3> _paramVec3;
  209. std::vector<UniformParamVec4> _paramVec4;
  210. std::vector<UniformParamMat4> _paramMat4;
  211. std::vector<UniformParamString> _paramString;
  212. std::vector<UniformParamTexture> _paramTexture;
  213. bool _useBlendFunc = false;
  214. BlendFunc _blendFunc; // 混合函数
  215. float _time; // 当前的时间
  216. std::map<std::string, bool> _editorUniforms;
  217. std::string _relativePath; // 材质文件的初始传入路径的前缀,非后面自己算的绝对路径
  218. std::string _materialPath; // 材质文件的初始传入路径
  219. };
  220. NS_CC_END
  221. #endif /* defined(CustomMaterial_hpp) */