#ifndef DUST3D_APPLICATION_MODEL_OPENGL_PROGRAM_H_ #define DUST3D_APPLICATION_MODEL_OPENGL_PROGRAM_H_ #include #include #include #include #include class ModelOpenGLProgram : public QOpenGLShaderProgram { public: void load(bool isCoreProfile = false); int getUniformLocationByName(const std::string& name); bool isCoreProfile() const; void bindMaps(); void releaseMaps(); void updateTextureImage(std::unique_ptr image); void updateNormalMapImage(std::unique_ptr image); void updateMetalnessRoughnessAmbientOcclusionMapImage(std::unique_ptr image, bool hasMetalnessMap = false, bool hasRoughnessMap = false, bool hasAmbientOcclusionMap = false); private: void addShaderFromResource(QOpenGLShader::ShaderType type, const char* resourceName); void activeAndBindTexture(int location, QOpenGLTexture* texture); bool m_isLoaded = false; bool m_isCoreProfile = false; std::map m_uniformLocationMap; std::unique_ptr m_environmentIrradianceMap; std::unique_ptr m_environmentSpecularMap; std::unique_ptr>> m_environmentIrradianceMaps; std::unique_ptr>> m_environmentSpecularMaps; std::unique_ptr m_textureImage; std::unique_ptr m_normalMapImage; std::unique_ptr m_metalnessRoughnessAmbientOcclusionMapImage; std::unique_ptr m_texture; std::unique_ptr m_normalMap; std::unique_ptr m_metalnessRoughnessAmbientOcclusionMap; bool m_hasMetalnessMap = false; bool m_hasRoughnessMap = false; bool m_hasAmbientOcclusionMap = false; QMutex m_imageMutex; bool m_imageIsDirty = false; bool m_metalnessMapEnabled = false; bool m_roughnessMapEnabled = false; bool m_ambientOcclusionMapEnabled = false; }; #endif