Skip to content

Commit

Permalink
use shared data context between artboard and state machine
Browse files Browse the repository at this point in the history
this PR changes multiple files addressing three things:
the first two are pretty basic changes: rename the method `dataContextFromInstance` to `setDataContextFromInstance` and remove the side effect of setting the parent of the data context in `internalDataContext`.
The other change is commented in the code: instead of creating a new data context for nested state machines, it is shared between the nested artboard and its state machines. This was already so in the cpp runtime, but the flutter bridge wasn't doing the same.

Diffs=
eed8230f8 use shared data context between artboard and state machine (#8299)

Co-authored-by: hernan <hernan@rive.app>
bodymovin and bodymovin committed Oct 8, 2024
1 parent 4dce6fd commit 87a2bcc
Showing 13 changed files with 38 additions and 40 deletions.
2 changes: 1 addition & 1 deletion .rive_head
Original file line number Diff line number Diff line change
@@ -1 +1 @@
56d95d2006868350ebb0c080447d07647d1a5855
eed8230f84e2894d0436dd1d94566c59f4dfcb6f
2 changes: 1 addition & 1 deletion include/rive/animation/nested_state_machine.hpp
Original file line number Diff line number Diff line change
@@ -36,7 +36,7 @@ class NestedStateMachine : public NestedStateMachineBase
size_t inputCount() { return m_nestedInputs.size(); }
NestedInput* input(size_t index);
NestedInput* input(std::string name);
void dataContextFromInstance(ViewModelInstance* viewModelInstance);
void setDataContextFromInstance(ViewModelInstance* viewModelInstance);
void dataContext(DataContext* dataContext);
};
} // namespace rive
2 changes: 1 addition & 1 deletion include/rive/animation/state_machine_instance.hpp
Original file line number Diff line number Diff line change
@@ -84,7 +84,7 @@ class StateMachineInstance : public Scene, public NestedEventNotifier, public Ne
SMIBool* getBool(const std::string& name) const override;
SMINumber* getNumber(const std::string& name) const override;
SMITrigger* getTrigger(const std::string& name) const override;
void dataContextFromInstance(ViewModelInstance* viewModelInstance) override;
void setDataContextFromInstance(ViewModelInstance* viewModelInstance) override;
void dataContext(DataContext* dataContext);

size_t currentAnimationCount() const;
14 changes: 7 additions & 7 deletions include/rive/artboard.hpp
Original file line number Diff line number Diff line change
@@ -181,14 +181,14 @@ class Artboard : public ArtboardBase, public CoreContext
bool isTranslucent() const;
bool isTranslucent(const LinearAnimation*) const;
bool isTranslucent(const LinearAnimationInstance*) const;
void dataContext(DataContext* dataContext, DataContext* parent);
void internalDataContext(DataContext* dataContext, DataContext* parent, bool isRoot);
void dataContext(DataContext* dataContext);
void internalDataContext(DataContext* dataContext, bool isRoot);
void clearDataContext();
void dataContextFromInstance(ViewModelInstance* viewModelInstance, DataContext* parent);
void dataContextFromInstance(ViewModelInstance* viewModelInstance,
DataContext* parent,
bool isRoot);
void dataContextFromInstance(ViewModelInstance* viewModelInstance);
void setDataContextFromInstance(ViewModelInstance* viewModelInstance, DataContext* parent);
void setDataContextFromInstance(ViewModelInstance* viewModelInstance,
DataContext* parent,
bool isRoot);
void setDataContextFromInstance(ViewModelInstance* viewModelInstance);
void addDataBind(DataBind* dataBind);
void populateDataBinds(std::vector<DataBind*>* dataBinds);
void sortDataBinds(std::vector<DataBind*> dataBinds);
4 changes: 2 additions & 2 deletions include/rive/nested_artboard.hpp
Original file line number Diff line number Diff line change
@@ -64,8 +64,8 @@ class NestedArtboard : public NestedArtboardBase
void decodeDataBindPathIds(Span<const uint8_t> value) override;
void copyDataBindPathIds(const NestedArtboardBase& object) override;
std::vector<uint32_t> dataBindPathIds() { return m_DataBindPathIdsBuffer; };
void dataContextFromInstance(ViewModelInstance* viewModelInstance, DataContext* parent);
void internalDataContext(DataContext* dataContext, DataContext* parent);
void setDataContextFromInstance(ViewModelInstance* viewModelInstance, DataContext* parent);
void internalDataContext(DataContext* dataContext);
void clearDataContext();
};
} // namespace rive
2 changes: 1 addition & 1 deletion include/rive/scene.hpp
Original file line number Diff line number Diff line change
@@ -48,7 +48,7 @@ class Scene : public KeyedCallbackReporter, public CallbackContext

void draw(Renderer*);

virtual void dataContextFromInstance(ViewModelInstance* viewModelInstance);
virtual void setDataContextFromInstance(ViewModelInstance* viewModelInstance);

virtual HitResult pointerDown(Vec2D);
virtual HitResult pointerMove(Vec2D);
4 changes: 2 additions & 2 deletions src/animation/nested_state_machine.cpp
Original file line number Diff line number Diff line change
@@ -109,11 +109,11 @@ NestedInput* NestedStateMachine::input(std::string name)

void NestedStateMachine::addNestedInput(NestedInput* input) { m_nestedInputs.push_back(input); }

void NestedStateMachine::dataContextFromInstance(ViewModelInstance* viewModelInstance)
void NestedStateMachine::setDataContextFromInstance(ViewModelInstance* viewModelInstance)
{
if (m_StateMachineInstance != nullptr)
{
m_StateMachineInstance->dataContextFromInstance(viewModelInstance);
m_StateMachineInstance->setDataContextFromInstance(viewModelInstance);
}
}

2 changes: 1 addition & 1 deletion src/animation/state_machine_instance.cpp
Original file line number Diff line number Diff line change
@@ -1137,7 +1137,7 @@ SMITrigger* StateMachineInstance::getTrigger(const std::string& name) const
return getNamedInput<StateMachineTrigger, SMITrigger>(name);
}

void StateMachineInstance::dataContextFromInstance(ViewModelInstance* viewModelInstance)
void StateMachineInstance::setDataContextFromInstance(ViewModelInstance* viewModelInstance)
{
dataContext(new DataContext(viewModelInstance));
}
30 changes: 14 additions & 16 deletions src/artboard.cpp
Original file line number Diff line number Diff line change
@@ -1173,10 +1173,9 @@ StatusCode Artboard::import(ImportStack& importStack)
return result;
}

void Artboard::internalDataContext(DataContext* value, DataContext* parent, bool isRoot)
void Artboard::internalDataContext(DataContext* value, bool isRoot)
{
m_DataContext = value;
m_DataContext->parent(parent);
for (auto nestedArtboard : m_NestedArtboards)
{
if (nestedArtboard->artboardInstance() == nullptr)
@@ -1186,11 +1185,11 @@ void Artboard::internalDataContext(DataContext* value, DataContext* parent, bool
auto value = m_DataContext->getViewModelInstance(nestedArtboard->dataBindPathIds());
if (value != nullptr && value->is<ViewModelInstance>())
{
nestedArtboard->dataContextFromInstance(value, m_DataContext);
nestedArtboard->setDataContextFromInstance(value, m_DataContext);
}
else
{
nestedArtboard->internalDataContext(m_DataContext, m_DataContext->parent());
nestedArtboard->internalDataContext(m_DataContext);
}
}
for (auto dataBind : m_DataBinds)
@@ -1271,24 +1270,21 @@ void Artboard::collectDataBinds()

void Artboard::addDataBind(DataBind* dataBind) { m_DataBinds.push_back(dataBind); }

void Artboard::dataContext(DataContext* value, DataContext* parent)
{
internalDataContext(value, parent, true);
}
void Artboard::dataContext(DataContext* value) { internalDataContext(value, true); }

void Artboard::dataContextFromInstance(ViewModelInstance* viewModelInstance)
void Artboard::setDataContextFromInstance(ViewModelInstance* viewModelInstance)
{
dataContextFromInstance(viewModelInstance, nullptr, true);
setDataContextFromInstance(viewModelInstance, nullptr, true);
}

void Artboard::dataContextFromInstance(ViewModelInstance* viewModelInstance, DataContext* parent)
void Artboard::setDataContextFromInstance(ViewModelInstance* viewModelInstance, DataContext* parent)
{
dataContextFromInstance(viewModelInstance, parent, true);
setDataContextFromInstance(viewModelInstance, parent, true);
}

void Artboard::dataContextFromInstance(ViewModelInstance* viewModelInstance,
DataContext* parent,
bool isRoot)
void Artboard::setDataContextFromInstance(ViewModelInstance* viewModelInstance,
DataContext* parent,
bool isRoot)
{
if (viewModelInstance == nullptr)
{
@@ -1298,7 +1294,9 @@ void Artboard::dataContextFromInstance(ViewModelInstance* viewModelInstance,
{
viewModelInstance->setAsRoot();
}
internalDataContext(new DataContext(viewModelInstance), parent, isRoot);
auto dataContext = new DataContext(viewModelInstance);
dataContext->parent(parent);
internalDataContext(dataContext, isRoot);
}

////////// ArtboardInstance
2 changes: 1 addition & 1 deletion src/data_bind/context/context_value_list.cpp
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ std::unique_ptr<ArtboardInstance> DataBindContextValueList::createArtboard(
auto dataContext = mainArtboard->dataContext();
auto artboardCopy = artboard->instance();
artboardCopy->advanceInternal(0.0f, false);
artboardCopy->dataContextFromInstance(listItem->viewModelInstance(), dataContext, false);
artboardCopy->setDataContextFromInstance(listItem->viewModelInstance(), dataContext, false);
return artboardCopy;
}
return nullptr;
10 changes: 5 additions & 5 deletions src/nested_artboard.cpp
Original file line number Diff line number Diff line change
@@ -276,9 +276,9 @@ void NestedArtboard::copyDataBindPathIds(const NestedArtboardBase& object)
m_DataBindPathIdsBuffer = object.as<NestedArtboard>()->m_DataBindPathIdsBuffer;
}

void NestedArtboard::internalDataContext(DataContext* value, DataContext* parent)
void NestedArtboard::internalDataContext(DataContext* value)
{
artboardInstance()->internalDataContext(value, parent, false);
artboardInstance()->internalDataContext(value, false);
for (auto animation : m_NestedAnimations)
{
if (animation->is<NestedStateMachine>())
@@ -290,10 +290,10 @@ void NestedArtboard::internalDataContext(DataContext* value, DataContext* parent

void NestedArtboard::clearDataContext() { artboardInstance()->clearDataContext(); }

void NestedArtboard::dataContextFromInstance(ViewModelInstance* viewModelInstance,
DataContext* parent)
void NestedArtboard::setDataContextFromInstance(ViewModelInstance* viewModelInstance,
DataContext* parent)
{
artboardInstance()->dataContextFromInstance(viewModelInstance, parent, false);
artboardInstance()->setDataContextFromInstance(viewModelInstance, parent, false);
for (auto animation : m_NestedAnimations)
{
if (animation->is<NestedStateMachine>())
2 changes: 1 addition & 1 deletion src/scene.cpp
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ SMIInput* Scene::input(size_t index) const { return nullptr; }
SMIBool* Scene::getBool(const std::string&) const { return nullptr; }
SMINumber* Scene::getNumber(const std::string&) const { return nullptr; }
SMITrigger* Scene::getTrigger(const std::string&) const { return nullptr; }
void Scene::dataContextFromInstance(ViewModelInstance* viewModelInstance) {}
void Scene::setDataContextFromInstance(ViewModelInstance* viewModelInstance) {}

void Scene::reportKeyedCallback(uint32_t objectId, uint32_t propertyKey, float elapsedSeconds)
{
2 changes: 1 addition & 1 deletion viewer/src/viewer_content/scene_content.cpp
Original file line number Diff line number Diff line change
@@ -88,7 +88,7 @@ class SceneContent : public ViewerContent
m_ArtboardInstance = m_File->artboardAt(m_ArtboardIndex);
// m_ViewModelInstance = m_File->viewModelInstanceNamed("vm-3");
m_ViewModelInstance = m_File->createViewModelInstance(m_ArtboardInstance.get());
m_ArtboardInstance->dataContextFromInstance(m_ViewModelInstance);
m_ArtboardInstance->setDataContextFromInstance(m_ViewModelInstance);

m_ArtboardInstance->advance(0.0f);
loadNames(m_ArtboardInstance.get());

0 comments on commit 87a2bcc

Please sign in to comment.