Skip to content

Commit

Permalink
refactor: remove current datablock from VisitState
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilippeCrassous committed Dec 14, 2020
1 parent 518e7a5 commit af2bf12
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 25 deletions.
30 changes: 11 additions & 19 deletions mixer/blender_data/bpy_data_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,21 +102,16 @@ class CurrentDatablockContext:

def __init__(self, visit_state: VisitState, proxy: DatablockProxy, datablock: T.ID):
self._visit_state = visit_state
self._datablock = datablock
self._is_embedded_data = datablock.is_embedded_data
self._proxy = proxy

def __enter__(self):
if self._is_embedded_data:
return
self._visit_state.datablock_proxy = self._proxy
self._visit_state.datablock = self._datablock
if not self._is_embedded_data:
self._visit_state.datablock_proxy = self._proxy

def __exit__(self, exc_type, exc_value, traceback):
if self._is_embedded_data:
return
self._visit_state.datablock_proxy = None
self._visit_state.datablock = None
if not self._is_embedded_data:
self._visit_state.datablock_proxy = None

Path = List[Union[str, int]]
"""The current visit path relative to the datablock, for instance in a GreasePencil datablock
Expand All @@ -129,13 +124,7 @@ def __exit__(self, exc_type, exc_value, traceback):
def __init__(self):

self.datablock_proxy: Optional[DatablockProxy] = None
"""The datablock proxy being visited.
Local state
"""

self.datablock: Optional[T.ID] = None
"""The datablock being visited.
"""The standalone datablock proxy being visited.
Local state
"""
Expand All @@ -144,19 +133,22 @@ def __init__(self):
"""The path to the current property from the current datablock, for instance in GreasePencil
["layers", "fills", "frames", 0, "strokes", 1, "points", 0].
Local state"""
Local state
"""

self.recursion_guard = RecursionGuard()
"""Keeps track of the data depth and guards agains excessive depth that may be caused
by circular references.
Local state"""
Local state
"""

self.dirty_vertex_groups: Set[Uuid] = set()
"""Uuids of the Mesh datablocks whose vertex_groups data has been updated since last loaded
into their MeshProxy.
Global state"""
Global state
"""

def enter_datablock(self, proxy: DatablockProxy, datablock: T.ID) -> VisitState.CurrentDatablockContext:
return VisitState.CurrentDatablockContext(self, proxy, datablock)
Expand Down
2 changes: 1 addition & 1 deletion mixer/blender_data/datablock_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def load(
self.clear_data()
properties = context.synchronized_properties.properties(datablock)
# this assumes that specifics.py apply only to ID, not Struct
properties = specifics.conditional_properties(datablock, properties, context)
properties = specifics.conditional_properties(datablock, properties)
with context.visit_state.enter_datablock(self, datablock):
for name, bl_rna_property in properties:
attr = getattr(datablock, name)
Expand Down
2 changes: 1 addition & 1 deletion mixer/blender_data/mesh_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ def _diff(
context.visit_state.dirty_vertex_groups.add(struct.mixer_uuid)

properties = context.synchronized_properties.properties(struct)
properties = specifics.conditional_properties(struct, properties, context)
properties = specifics.conditional_properties(struct, properties)
for k, member_property in properties:
try:
member = getattr(struct, k)
Expand Down
4 changes: 2 additions & 2 deletions mixer/blender_data/specifics.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ def bpy_data_ctor_shape_keys(collection_name: str, proxy: DatablockProxy, contex
]


def conditional_properties(bpy_struct: T.Struct, properties: ItemsView, context: Context) -> ItemsView:
def conditional_properties(bpy_struct: T.Struct, properties: ItemsView) -> ItemsView:
"""Filter properties list according to a specific property value in the same ID
This prevents loading values that cannot always be saved, such as Object.instance_collection
Expand Down Expand Up @@ -403,7 +403,7 @@ def conditional_properties(bpy_struct: T.Struct, properties: ItemsView, context:
return filtered.items()

if isinstance(bpy_struct, T.LayerCollection):
scene = context.visit_state.datablock
scene = bpy_struct.id_data
if bpy_struct.collection != scene.collection:
return properties

Expand Down
4 changes: 2 additions & 2 deletions mixer/blender_data/struct_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def load(self, attribute: T.bpy_struct, key: Union[int, str], context: Context)
properties = context.synchronized_properties.properties(attribute)
# includes properties from the bl_rna only, not the "view like" properties like MeshPolygon.edge_keys
# that we do not want to load anyway
properties = specifics.conditional_properties(attribute, properties, context)
properties = specifics.conditional_properties(attribute, properties)
context.visit_state.path.append(key)
try:
for name, bl_rna_property in properties:
Expand Down Expand Up @@ -226,7 +226,7 @@ def _diff(
context.visit_state.path.append(key)
try:
properties = context.synchronized_properties.properties(attribute)
properties = specifics.conditional_properties(attribute, properties, context)
properties = specifics.conditional_properties(attribute, properties)
for k, member_property in properties:
# TODO in test_differential.StructDatablockRef.test_remove
# target et a scene, k is world and v (current world value) is None
Expand Down

0 comments on commit af2bf12

Please sign in to comment.