123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- //
- // CustomMaterial.hpp
- // building
- //
- // Created by yanqian on 2023/5/8.
- //
- #ifndef CustomMaterial_hpp
- #define CustomMaterial_hpp
- #include "cocos2d.h"
- #include "renderer/CCMaterial.h"
- NS_CC_BEGIN
- // float类型参数
- struct UniformParamFloat {
- std::string name;
- float value;
- UniformParamFloat(const std::string& aname, const float& avalue) : name(aname), value(avalue) { }
- };
- // Vec2类型参数
- struct UniformParamVec2 {
- std::string name;
- Vec2 value;
- UniformParamVec2(const std::string& aname, const Vec2& avalue) : name(aname), value(avalue) { }
- };
- // Vec3类型参数
- struct UniformParamVec3 {
- std::string name;
- Vec3 value;
- UniformParamVec3(const std::string& aname, const Vec3& avalue) : name(aname), value(avalue) { }
- };
- // Vec3类型参数
- struct UniformParamVec4 {
- std::string name;
- Vec4 value;
- UniformParamVec4(const std::string& aname, const Vec4& avalue) : name(aname), value(avalue) { }
- };
- // Mat4类型参数
- struct UniformParamMat4 {
- std::string name;
- Mat4 value;
- UniformParamMat4(const std::string& aname, const Mat4& avalue) : name(aname), value(avalue) { }
- };
- // string类型参数
- struct UniformParamString {
- std::string name;
- std::string value;
- UniformParamString(const std::string& aname, const std::string& avalue) : name(aname), value(avalue) { }
- };
- // 纹理类型参数
- struct UniformParamTexture {
- std::string name;
- Texture2D::TexParams texParams;
- UniformParamTexture(const std::string& aname, const Texture2D::TexParams& atexParams) : name(aname), texParams(atexParams) { }
- };
- class Technique;
- class Pass;
- class CustomMaterial : public Material {
-
- public:
- CustomMaterial();
- virtual ~CustomMaterial();
-
- /**
- * 根据配置文件创建一个材质
- * @param path 材质文件的路径
- * @return CustomMaterial 材质对象
- */
- static CustomMaterial* createWithFilename(const std::string& path);
-
- /**
- * 每帧进行time累加
- */
- virtual void updateUniformTime(float delta);
- /**
- * 获取材质的 float 类型参数列表
- */
- const std::vector<UniformParamFloat> getParamsFloat();
-
- /**
- * 获取材质的 Vec2 类型参数列表
- */
- const std::vector<UniformParamVec2> getParamsVec2();
-
- /**
- * 获取材质的 Vec3 类型参数列表
- */
- const std::vector<UniformParamVec3> getParamsVec3();
-
- /**
- * 获取材质的 Vec4 类型参数列表
- */
- const std::vector<UniformParamVec4> getParamsVec4();
-
- /**
- * 获取材质的 Mat4 类型参数列表
- */
- const std::vector<UniformParamMat4> getParamsMat4();
-
- /**
- * 获取材质的 string 类型参数列表
- */
- const std::vector<UniformParamString> getParamsString();
-
- /**
- * 设置材质的 float 类型参数
- * @param name 参数名
- * @param value 参数值
- */
- void setParamFloat(std::string name, float value);
-
- /**
- * 设置材质的 Vec2 类型参数
- * @param name 参数名
- * @param value 参数值
- */
- void setParamsVec2(std::string name, Vec2 value);
-
- /**
- * 设置材质的 Vec3 类型参数
- * @param name 参数名
- * @param value 参数值
- */
- void setParamsVec3(std::string name, Vec3 value);
-
- /**
- * 设置材质的 Vec4 类型参数
- * @param name 参数名
- * @param value 参数值
- */
- void setParamsVec4(std::string name, Vec4 value);
-
- /**
- * 设置材质的 Mat4 类型参数
- * @param name 参数名
- * @param value 参数值
- */
- void setParamsMat4(std::string name, Mat4 value);
-
- /**
- * 设置材质的 string 类型参数
- * @param name 参数名
- * @param value 参数值
- */
- void setParamsString(std::string name, std::string value);
-
- /**
- * 设置材质的纹理参数
- * @param spriteFrame 纹理
- */
- void setParamsTexture(SpriteFrame* spriteFrame);
-
- /**
- * 获取材质文件的相对路径
- */
- std::string getMaterialPath();
-
- /**
- * 设置材质文件的相对路径
- */
- void setMaterialPath(std::string materialPath);
-
- /**
- * 是否要使用混合函数
- */
- bool useBlendFunc();
-
- /**
- * 获取混合函数
- */
- BlendFunc getBlendFunc();
-
- protected:
- /**
- * 通过材质的配置文件初始化一个材质对象
- * @param file 材质文件
- */
- bool initWithFile(const std::string& file);
-
- /**
- * 解析材质属性
- */
- bool parseProperties(Properties* properties);
-
- /**
- * 解析材质中的technique属性
- */
- bool parseTechnique(Properties* properties);
-
- /**
- * 解析材质中的pass属性
- */
- bool parsePass(Technique* technique, Properties* properties);
-
- /**
- * 解析材质中的shader
- */
- bool parseShader(Pass* pass, Properties* properties);
-
- /**
- * 解析材质中的混合模式
- */
- bool parseRenderState(RenderState* renderState, Properties* properties);
-
- /**
- * 解析混合函数
- */
- int _parseBlend(const std::string& value);
-
- /**
- * 解析材质中的纹理
- */
- bool parseSampler(GLProgramState* glProgramState, Properties* properties);
-
- /**
- * 解析editorUniform
- */
- bool _parseEditorUniform(Properties* paramsProperties);
-
- /**
- * 解析并设置uniform变量
- */
- bool _parseUniformParams(GLProgramState* programState, Properties* paramsProperties);
-
- /**
- * 获取one pass 的programState
- */
- GLProgramState* _getGLProgramState();
-
- /**
- * 设置材质文件的相对路径的前缀
- */
- void setRelativePath(std::string relativePath);
-
- /**
- * 获取材质文件的相对路径的前缀
- */
- std::string getRelativePath();
-
-
- private:
-
- std::vector<UniformParamFloat> _paramFloat; // float类型的uniform参数列表
- std::vector<UniformParamVec2> _paramVec2;
- std::vector<UniformParamVec3> _paramVec3;
- std::vector<UniformParamVec4> _paramVec4;
- std::vector<UniformParamMat4> _paramMat4;
- std::vector<UniformParamString> _paramString;
- std::vector<UniformParamTexture> _paramTexture;
- bool _useBlendFunc = false;
- BlendFunc _blendFunc; // 混合函数
-
- float _time; // 当前的时间
-
- std::map<std::string, bool> _editorUniforms;
- std::string _relativePath; // 材质文件的初始传入路径的前缀,非后面自己算的绝对路径
- std::string _materialPath; // 材质文件的初始传入路径
- };
- NS_CC_END
- #endif /* defined(CustomMaterial_hpp) */
|