blob: 97a6c559436e946d9201873b73fd935bc9f8e5b8 [file] [log] [blame]
#include "rive/importers/backboard_importer.hpp"
#include "rive/artboard.hpp"
#include "rive/nested_artboard.hpp"
#include "rive/backboard.hpp"
#include "rive/assets/file_asset_referencer.hpp"
#include "rive/assets/file_asset.hpp"
#include "rive/viewmodel/viewmodel.hpp"
#include "rive/viewmodel/viewmodel_instance.hpp"
#include "rive/data_bind/converters/data_converter.hpp"
#include "rive/data_bind/converters/data_converter_group_item.hpp"
#include "rive/data_bind/data_bind.hpp"
#include <unordered_set>
using namespace rive;
BackboardImporter::BackboardImporter(Backboard* backboard) :
m_Backboard(backboard), m_NextArtboardId(0)
{}
void BackboardImporter::addNestedArtboard(NestedArtboard* artboard)
{
m_NestedArtboards.push_back(artboard);
}
void BackboardImporter::addFileAsset(FileAsset* asset)
{
m_FileAssets.push_back(asset);
{
// EDITOR BUG 4204
// --------------
// Ensure assetIds are unique. Due to an editor bug:
// https://github.com/rive-app/rive/issues/4204
std::unordered_set<uint32_t> ids;
uint32_t nextId = 1;
for (auto fileAsset : m_FileAssets)
{
if (ids.count(fileAsset->assetId()))
{
fileAsset->assetId(nextId);
}
else
{
ids.insert(fileAsset->assetId());
if (fileAsset->assetId() >= nextId)
{
nextId = fileAsset->assetId() + 1;
}
}
}
// --------------
}
}
void BackboardImporter::addFileAssetReferencer(FileAssetReferencer* referencer)
{
m_FileAssetReferencers.push_back(referencer);
}
void BackboardImporter::addArtboard(Artboard* artboard)
{
m_ArtboardLookup[m_NextArtboardId++] = artboard;
}
void BackboardImporter::addMissingArtboard() { m_NextArtboardId++; }
StatusCode BackboardImporter::resolve()
{
for (auto nestedArtboard : m_NestedArtboards)
{
auto itr = m_ArtboardLookup.find(nestedArtboard->artboardId());
if (itr != m_ArtboardLookup.end())
{
auto artboard = itr->second;
if (artboard != nullptr)
{
nestedArtboard->nest(artboard);
}
}
}
for (auto referencer : m_FileAssetReferencers)
{
auto index = (size_t)referencer->assetId();
if (index >= m_FileAssets.size())
{
continue;
}
auto asset = m_FileAssets[index];
referencer->setAsset(asset);
}
for (auto referencer : m_DataConverterReferencers)
{
auto index = (size_t)referencer->converterId();
if (index >= m_DataConverters.size() || index < 0)
{
continue;
}
referencer->converter(m_DataConverters[index]);
}
for (auto referencer : m_DataConverterGroupItemReferencers)
{
auto index = (size_t)referencer->converterId();
if (index >= m_DataConverters.size() || index < 0)
{
continue;
}
referencer->converter(m_DataConverters[index]);
}
return StatusCode::Ok;
}
void BackboardImporter::addDataConverter(DataConverter* dataConverter)
{
m_DataConverters.push_back(dataConverter);
}
void BackboardImporter::addDataConverterReferencer(DataBind* dataBind)
{
m_DataConverterReferencers.push_back(dataBind);
}
void BackboardImporter::addDataConverterGroupItemReferencer(DataConverterGroupItem* dataBind)
{
m_DataConverterGroupItemReferencers.push_back(dataBind);
}