refactor: add gpencil back
This commit is contained in:
@ -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",
|
||||||
|
@ -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
|
@ -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)
|
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user