// // 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 getParamsFloat(); /** * 获取材质的 Vec2 类型参数列表 */ const std::vector getParamsVec2(); /** * 获取材质的 Vec3 类型参数列表 */ const std::vector getParamsVec3(); /** * 获取材质的 Vec4 类型参数列表 */ const std::vector getParamsVec4(); /** * 获取材质的 Mat4 类型参数列表 */ const std::vector getParamsMat4(); /** * 获取材质的 string 类型参数列表 */ const std::vector 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 _paramFloat; // float类型的uniform参数列表 std::vector _paramVec2; std::vector _paramVec3; std::vector _paramVec4; std::vector _paramMat4; std::vector _paramString; std::vector _paramTexture; bool _useBlendFunc = false; BlendFunc _blendFunc; // 混合函数 float _time; // 当前的时间 std::map _editorUniforms; std::string _relativePath; // 材质文件的初始传入路径的前缀,非后面自己算的绝对路径 std::string _materialPath; // 材质文件的初始传入路径 }; NS_CC_END #endif /* defined(CustomMaterial_hpp) */