#include #include #include #include namespace mbgl { ProgramParameters::ProgramParameters(const float pixelRatio, const bool overdraw) : defines(2) { defines["DEVICE_PIXEL_RATIO"] = util::toString(pixelRatio, true); if (overdraw) { defines["OVERDRAW_INSPECTOR"] = std::string(); } } ProgramParameters ProgramParameters::withShaderSource(const ProgramSource& source) const noexcept { assert(gfx::Backend::Type::TYPE_MAX != source.backend); ProgramParameters params = *this; params.userSources[static_cast(source.backend)] = source; return params; } ProgramParameters ProgramParameters::withDefaultSource(const ProgramSource& source) const noexcept { assert(gfx::Backend::Type::TYPE_MAX != source.backend); ProgramParameters params = *this; params.defaultSources[static_cast(source.backend)] = source; return params; } const std::string& ProgramParameters::getDefinesString() const { if (definesStr.empty() && !defines.empty()) { definesStr.assign(defines.size() * 32, '\0'); definesStr.clear(); for (const auto& pair : defines) { definesStr.append("#define ").append(pair.first); if (!pair.second.empty()) { definesStr.append(" ").append(pair.second); } definesStr.append("\n"); } } return definesStr; } const std::string& ProgramParameters::vertexSource(gfx::Backend::Type backend) const { assert(gfx::Backend::Type::TYPE_MAX != backend); if (userSources[static_cast(backend)].vertex.length() > 0) { return userSources[static_cast(backend)].vertex; } else if (defaultSources[static_cast(backend)].vertex.length() > 0) { return defaultSources[static_cast(backend)].vertex; } else { throw std::runtime_error("No vertex shader source provided for selected backend!"); } } const std::string& ProgramParameters::fragmentSource(gfx::Backend::Type backend) const { assert(gfx::Backend::Type::TYPE_MAX != backend); if (userSources[static_cast(backend)].fragment.length() > 0) { return userSources[static_cast(backend)].fragment; } else if (defaultSources[static_cast(backend)].fragment.length() > 0) { return defaultSources[static_cast(backend)].fragment; } else { throw std::runtime_error("No fragment shader source provided for selected backend!"); } } } // namespace mbgl