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(); }
bool Material::deserializeTexture(JsonSerializer& serializer, const char* material_dir) { char path[MAX_PATH_LENGTH]; serializer.deserializeObjectBegin(); char label[256]; bool keep_data = false; uint32 flags = 0; int atlas_size = -1; while (!serializer.isObjectEnd()) { serializer.deserializeLabel(label, sizeof(label)); if (compareString(label, "source") == 0) { serializer.deserialize(path, MAX_PATH_LENGTH, ""); if (path[0] != '\0') { char texture_path[MAX_PATH_LENGTH]; if (path[0] != '/' && path[0] != '\\') { copyString(texture_path, material_dir); catString(texture_path, path); } else { copyString(texture_path, path); } m_textures[m_texture_count] = static_cast<Texture*>( m_resource_manager.get(ResourceManager::TEXTURE)->load(Path(texture_path))); addDependency(*m_textures[m_texture_count]); } } else if (compareString(label, "atlas_size") == 0) { serializer.deserialize(atlas_size, -1); } else if (compareString(label, "min_filter") == 0) { serializer.deserialize(label, sizeof(label), ""); if (compareString(label, "point") == 0) { flags |= BGFX_TEXTURE_MIN_POINT; } else if (compareString(label, "anisotropic") == 0) { flags |= BGFX_TEXTURE_MIN_ANISOTROPIC; } else { g_log_error.log("Renderer") << "Unknown texture filter \"" << label << "\" in material " << getPath().c_str(); } } else if (compareString(label, "mag_filter") == 0) { serializer.deserialize(label, sizeof(label), ""); if (compareString(label, "point") == 0) { flags |= BGFX_TEXTURE_MAG_POINT; } else if (compareString(label, "anisotropic") == 0) { flags |= BGFX_TEXTURE_MAG_ANISOTROPIC; } else { g_log_error.log("Renderer") << "Unknown texture filter \"" << label << "\" in material " << getPath().c_str(); } } else if (compareString(label, "u_clamp") == 0) { bool b; serializer.deserialize(b, false); if (b) { flags |= BGFX_TEXTURE_U_CLAMP; } } else if (compareString(label, "v_clamp") == 0) { bool b; serializer.deserialize(b, false); if (b) { flags |= BGFX_TEXTURE_V_CLAMP; } } else if (compareString(label, "w_clamp") == 0) { bool b; serializer.deserialize(b, false); if (b) { flags |= BGFX_TEXTURE_W_CLAMP; } } else if (compareString(label, "keep_data") == 0) { serializer.deserialize(keep_data, false); } else { g_log_warning.log("Renderer") << "Unknown data \"" << label << "\" in material " << getPath().c_str(); return false; } } if (m_textures[m_texture_count]) { m_textures[m_texture_count]->setAtlasSize(atlas_size); m_textures[m_texture_count]->setFlags(flags); if (keep_data) { m_textures[m_texture_count]->addDataReference(); } } serializer.deserializeObjectEnd(); ++m_texture_count; return true; }