void Material::deserializeUniforms(JsonSerializer& serializer) { serializer.deserializeArrayBegin(); clearUniforms(); while (!serializer.isArrayEnd()) { Uniform& uniform = m_uniforms.pushEmpty(); serializer.nextArrayItem(); serializer.deserializeObjectBegin(); char label[256]; auto uniform_type = bgfx::UniformType::End; while (!serializer.isObjectEnd()) { serializer.deserializeLabel(label, 255); if (compareString(label, "name") == 0) { serializer.deserialize(uniform.m_name, Uniform::MAX_NAME_LENGTH, ""); uniform.m_name_hash = crc32(uniform.m_name); } else if (compareString(label, "int_value") == 0) { uniform_type = bgfx::UniformType::Int1; uniform.m_type = Uniform::INT; serializer.deserialize(uniform.m_int, 0); } else if (compareString(label, "float_value") == 0) { uniform.m_type = Uniform::FLOAT; serializer.deserialize(uniform.m_float, 0); } else if (compareString(label, "matrix_value") == 0) { uniform_type = bgfx::UniformType::Mat4; uniform.m_type = Uniform::MATRIX; serializer.deserializeArrayBegin(); for (int i = 0; i < 16; ++i) { serializer.deserializeArrayItem(uniform.m_matrix[i], 0); ASSERT(i == 15 || !serializer.isArrayEnd()); } serializer.deserializeArrayEnd(); } else if (compareString(label, "time") == 0) { uniform.m_type = Uniform::TIME; serializer.deserialize(uniform.m_float, 0); } else { g_log_warning.log("material") << "Unknown label \"" << label << "\""; } } uniform.m_handle = bgfx::createUniform(uniform.m_name, uniform_type); serializer.deserializeObjectEnd(); } serializer.deserializeArrayEnd(); }
void StelQGLGLSLShader::release() { Q_ASSERT_X(bound && state == State_Built, Q_FUNC_INFO, "Trying to release an unbound shader"); clearUniforms(); // The reference is passed to ensure the custom shader used is really this one. if(!internal){renderer->releaseCustomShader(this);} bound = false; }
void Material::unload(void) { clearUniforms(); setShader(nullptr); ResourceManagerBase* texture_manager = m_resource_manager.get(ResourceManager::TEXTURE); for (int i = 0; i < m_texture_count; i++) { if (m_textures[i]) { removeDependency(*m_textures[i]); texture_manager->unload(*m_textures[i]); } } m_texture_count = 0; }