refactor: add gpencil back

This commit is contained in:
Swann
2021-05-19 13:56:42 +02:00
parent e2e0dc31c1
commit 49fadf084a
3 changed files with 35 additions and 65 deletions

View File

@ -28,7 +28,6 @@ __all__ = [
'bl_light', 'bl_light',
'bl_scene', 'bl_scene',
'bl_material', 'bl_material',
'bl_library',
'bl_armature', 'bl_armature',
'bl_action', 'bl_action',
'bl_world', 'bl_world',
@ -39,7 +38,6 @@ __all__ = [
'bl_font', 'bl_font',
'bl_sound', 'bl_sound',
'bl_file', 'bl_file',
# 'bl_sequencer',
'bl_node_group', 'bl_node_group',
'bl_texture', 'bl_texture',
"bl_particle", "bl_particle",

View File

@ -25,6 +25,8 @@ from .dump_anything import (Dumper,
np_dump_collection, np_dump_collection,
np_load_collection) np_load_collection)
from replication.protocol import ReplicatedDatablock from replication.protocol import ReplicatedDatablock
from .bl_datablock import resolve_datablock_from_uuid
from .bl_action import dump_animation_data, load_animation_data, resolve_animation_dependencies
# GPencil data api is structured as it follow: # GPencil data api is structured as it follow:
# GP-Object --> GP-Layers --> GP-Frames --> GP-Strokes --> GP-Stroke-Points # GP-Object --> GP-Layers --> GP-Frames --> GP-Strokes --> GP-Stroke-Points
@ -113,6 +115,7 @@ def load_stroke(stroke_data, stroke):
# fix fill issues # fix fill issues
stroke.uv_scale = stroke_data["uv_scale"] stroke.uv_scale = stroke_data["uv_scale"]
def dump_frame(frame): def dump_frame(frame):
""" Dump a grease pencil frame to a dict """ Dump a grease pencil frame to a dict
@ -151,6 +154,7 @@ def load_frame(frame_data, frame):
np_load_collection(frame_data['strokes'], frame.strokes, STROKE) np_load_collection(frame_data['strokes'], frame.strokes, STROKE)
def dump_layer(layer): def dump_layer(layer):
""" Dump a grease pencil layer """ Dump a grease pencil layer
@ -227,7 +231,6 @@ def load_layer(layer_data, layer):
load_frame(frame_data, target_frame) load_frame(frame_data, target_frame)
class BlGpencil(ReplicatedDatablock): class BlGpencil(ReplicatedDatablock):
bl_id = "grease_pencils" bl_id = "grease_pencils"
bl_class = bpy.types.GreasePencil bl_class = bpy.types.GreasePencil
@ -235,40 +238,40 @@ class BlGpencil(ReplicatedDatablock):
bl_icon = 'GREASEPENCIL' bl_icon = 'GREASEPENCIL'
bl_reload_parent = False bl_reload_parent = False
@staticmethod
def construct(data: dict) -> object: def construct(data: dict) -> object:
return bpy.data.grease_pencils.new(data["name"]) return bpy.data.grease_pencils.new(data["name"])
@staticmethod
def load(data: dict, datablock: object): def load(data: dict, datablock: object):
target.materials.clear() datablock.materials.clear()
if "materials" in data.keys(): if "materials" in data.keys():
for mat in data['materials']: for mat in data['materials']:
target.materials.append(bpy.data.materials[mat]) datablock.materials.append(bpy.data.materials[mat])
loader = Loader() loader = Loader()
loader.load(target, data) loader.load(datablock, data)
# TODO: reuse existing layer # TODO: reuse existing layer
for layer in target.layers: for layer in datablock.layers:
target.layers.remove(layer) datablock.layers.remove(layer)
if "layers" in data.keys(): if "layers" in data.keys():
for layer in data["layers"]: for layer in data["layers"]:
layer_data = data["layers"].get(layer) layer_data = data["layers"].get(layer)
# if layer not in target.layers.keys(): # if layer not in datablock.layers.keys():
target_layer = target.layers.new(data["layers"][layer]["info"]) target_layer = datablock.layers.new(data["layers"][layer]["info"])
# else: # else:
# target_layer = target.layers[layer] # target_layer = target.layers[layer]
# target_layer.clear() # target_layer.clear()
load_layer(layer_data, target_layer) load_layer(layer_data, target_layer)
target.layers.update() datablock.layers.update()
@staticmethod
def dump(datablock: object) -> dict: def dump(datablock: object) -> dict:
assert(instance)
dumper = Dumper() dumper = Dumper()
dumper.depth = 2 dumper.depth = 2
dumper.include_filter = [ dumper.include_filter = [
@ -279,28 +282,39 @@ class BlGpencil(ReplicatedDatablock):
'pixel_factor', 'pixel_factor',
'stroke_depth_order' 'stroke_depth_order'
] ]
data = dumper.dump(instance) data = dumper.dump(datablock)
data['layers'] = {} data['layers'] = {}
for layer in instance.layers: for layer in datablock.layers:
data['layers'][layer.info] = dump_layer(layer) data['layers'][layer.info] = dump_layer(layer)
data["active_layers"] = instance.layers.active.info if instance.layers.active else "None" data["active_layers"] = datablock.layers.active.info if datablock.layers.active else "None"
data["eval_frame"] = bpy.context.scene.frame_current data["eval_frame"] = bpy.context.scene.frame_current
return data return data
@staticmethod
def resolve(data: dict) -> object:
uuid = data.get('uuid')
name = data.get('name')
datablock = resolve_datablock_from_uuid(uuid, bpy.data.grease_pencils)
if datablock is None:
datablock = bpy.data.grease_pencils.get(name)
return datablock
@staticmethod
def resolve_deps(datablock: object) -> [object]: def resolve_deps(datablock: object) -> [object]:
deps = [] deps = []
for material in self.instance.materials: for material in datablock.materials:
deps.append(material) deps.append(material)
return deps return deps
def layer_changed(self): def layer_changed(self):
if self.instance.layers.active and \ if datablock.layers.active and \
self.instance.layers.active.info != self.data["active_layers"]: datablock.layers.active.info != self.data["active_layers"]:
return True return True
else: else:
return False return False
@ -317,3 +331,6 @@ class BlGpencil(ReplicatedDatablock):
return super().diff() return super().diff()
else: else:
return None return None
_type = bpy.types.GreasePencil
_class = BlGpencil

View File

@ -1,45 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# ##### END GPL LICENSE BLOCK #####
import bpy
import mathutils
from .dump_anything import Loader, Dumper
from replication.protocol import ReplicatedDatablock
class BlLibrary(ReplicatedDatablock):
bl_id = "libraries"
bl_class = bpy.types.Library
bl_check_common = False
bl_icon = 'LIBRARY_DATA_DIRECT'
bl_reload_parent = False
def construct(data: dict) -> object:
with bpy.data.libraries.load(filepath=data["filepath"], link=True) as (sourceData, targetData):
targetData = sourceData
return sourceData
def _load(self, data, target):
pass
def _dump(self, instance=None):
assert(instance)
dumper = Dumper()
return dumper.dump(instance)