Merge branch 'develop' into 132-fix-undo-edit-last-operation-redo-handling
This commit is contained in:
commit
4bd0055056
14
CHANGELOG.md
14
CHANGELOG.md
@ -97,23 +97,31 @@ All notable changes to this project will be documented in this file.
|
||||
- Snapshot UUID error
|
||||
- The world is not synchronized
|
||||
|
||||
## [0.1.1] - Preview
|
||||
## [0.1.1] - 2020-10-16
|
||||
|
||||
### Added
|
||||
|
||||
- Session status widget
|
||||
- Affect dependencies during change owner
|
||||
- Dedicated server managment scripts(@brybalicious)
|
||||
|
||||
### Changed
|
||||
|
||||
- Refactored presence.py
|
||||
|
||||
- Reset button UI icon
|
||||
- Documentation `How to contribute` improvements (@brybalicious)
|
||||
- Documentation `Hosting guide` improvements (@brybalicious)
|
||||
- Show flags are now available from the viewport overlay
|
||||
|
||||
### Fixed
|
||||
|
||||
- Render sync race condition (causing scene errors)
|
||||
- Binary differentials
|
||||
- Hybrid session crashes between linux/windows
|
||||
- Hybrid session crashes between Linux/Windows
|
||||
- Materials node default output value
|
||||
- Right selection
|
||||
- Client node rights changed to COMMON after disconnecting from the server
|
||||
- Collection instances selection draw
|
||||
- Packed image save error
|
||||
- Material replication
|
||||
- UI spelling errors (@brybalicious)
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 13 KiB |
Binary file not shown.
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 559 B |
@ -205,22 +205,22 @@ class BlMaterial(BlDatablock):
|
||||
|
||||
def _load_implementation(self, data, target):
|
||||
loader = Loader()
|
||||
target.name = data['name']
|
||||
if data['is_grease_pencil']:
|
||||
|
||||
is_grease_pencil = data.get('is_grease_pencil')
|
||||
use_nodes = data.get('use_nodes')
|
||||
|
||||
loader.load(target, data)
|
||||
|
||||
if is_grease_pencil:
|
||||
if not target.is_grease_pencil:
|
||||
bpy.data.materials.create_gpencil_data(target)
|
||||
|
||||
loader.load(
|
||||
target.grease_pencil, data['grease_pencil'])
|
||||
|
||||
if data["use_nodes"]:
|
||||
loader.load(target.grease_pencil, data['grease_pencil'])
|
||||
elif use_nodes:
|
||||
if target.node_tree is None:
|
||||
target.use_nodes = True
|
||||
|
||||
target.node_tree.nodes.clear()
|
||||
|
||||
loader.load(target, data)
|
||||
|
||||
# Load nodes
|
||||
for node in data["node_tree"]["nodes"]:
|
||||
load_node(data["node_tree"]["nodes"][node], target.node_tree)
|
||||
@ -234,57 +234,69 @@ class BlMaterial(BlDatablock):
|
||||
assert(instance)
|
||||
mat_dumper = Dumper()
|
||||
mat_dumper.depth = 2
|
||||
mat_dumper.exclude_filter = [
|
||||
"is_embed_data",
|
||||
"is_evaluated",
|
||||
"name_full",
|
||||
"bl_description",
|
||||
"bl_icon",
|
||||
"bl_idname",
|
||||
"bl_label",
|
||||
"preview",
|
||||
"original",
|
||||
"uuid",
|
||||
"users",
|
||||
"alpha_threshold",
|
||||
"line_color",
|
||||
"view_center",
|
||||
mat_dumper.include_filter = [
|
||||
'name',
|
||||
'blend_method',
|
||||
'shadow_method',
|
||||
'alpha_threshold',
|
||||
'show_transparent_back',
|
||||
'use_backface_culling',
|
||||
'use_screen_refraction',
|
||||
'use_sss_translucency',
|
||||
'refraction_depth',
|
||||
'preview_render_type',
|
||||
'use_preview_world',
|
||||
'pass_index',
|
||||
'use_nodes',
|
||||
'diffuse_color',
|
||||
'specular_color',
|
||||
'roughness',
|
||||
'specular_intensity',
|
||||
'metallic',
|
||||
'line_color',
|
||||
'line_priority',
|
||||
'is_grease_pencil'
|
||||
]
|
||||
data = mat_dumper.dump(instance)
|
||||
|
||||
if instance.use_nodes:
|
||||
nodes = {}
|
||||
data["node_tree"] = {}
|
||||
for node in instance.node_tree.nodes:
|
||||
nodes[node.name] = dump_node(node)
|
||||
data["node_tree"]['nodes'] = nodes
|
||||
|
||||
data["node_tree"]["links"] = dump_links(instance.node_tree.links)
|
||||
|
||||
if instance.is_grease_pencil:
|
||||
elif instance.is_grease_pencil:
|
||||
gp_mat_dumper = Dumper()
|
||||
gp_mat_dumper.depth = 3
|
||||
|
||||
gp_mat_dumper.include_filter = [
|
||||
'color',
|
||||
'fill_color',
|
||||
'mix_color',
|
||||
'mix_factor',
|
||||
'mix_stroke_factor',
|
||||
# 'texture_angle',
|
||||
# 'texture_scale',
|
||||
# 'texture_offset',
|
||||
'pixel_size',
|
||||
'hide',
|
||||
'lock',
|
||||
'ghost',
|
||||
# 'texture_clamp',
|
||||
'flip',
|
||||
'use_overlap_strokes',
|
||||
'show_stroke',
|
||||
'show_fill',
|
||||
'alignment_mode',
|
||||
'pass_index',
|
||||
'mode',
|
||||
'stroke_style',
|
||||
'color',
|
||||
'use_overlap_strokes',
|
||||
'show_fill',
|
||||
# 'stroke_image',
|
||||
'fill_style',
|
||||
'fill_color',
|
||||
'pass_index',
|
||||
'alignment_mode',
|
||||
# 'fill_image',
|
||||
'texture_opacity',
|
||||
'mix_factor',
|
||||
'texture_offset',
|
||||
'texture_angle',
|
||||
'texture_scale',
|
||||
'texture_clamp',
|
||||
'gradient_type',
|
||||
'mix_color',
|
||||
'flip'
|
||||
# 'fill_image',
|
||||
]
|
||||
data['grease_pencil'] = gp_mat_dumper.dump(instance.grease_pencil)
|
||||
return data
|
||||
|
@ -339,7 +339,7 @@ class SessionStopOperator(bpy.types.Operator):
|
||||
class SessionKickOperator(bpy.types.Operator):
|
||||
bl_idname = "session.kick"
|
||||
bl_label = "Kick"
|
||||
bl_description = "Kick the user"
|
||||
bl_description = "Kick the target user"
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
user: bpy.props.StringProperty()
|
||||
@ -369,8 +369,9 @@ class SessionKickOperator(bpy.types.Operator):
|
||||
|
||||
class SessionPropertyRemoveOperator(bpy.types.Operator):
|
||||
bl_idname = "session.remove_prop"
|
||||
bl_label = "remove"
|
||||
bl_description = "broadcast a property to connected client_instances"
|
||||
bl_label = "Delete cache"
|
||||
bl_description = "Stop tracking modification on the target datablock." + \
|
||||
"The datablock will no longer be updated for others client. "
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
property_path: bpy.props.StringProperty(default="None")
|
||||
@ -393,11 +394,12 @@ class SessionPropertyRemoveOperator(bpy.types.Operator):
|
||||
|
||||
class SessionPropertyRightOperator(bpy.types.Operator):
|
||||
bl_idname = "session.right"
|
||||
bl_label = "Change owner to"
|
||||
bl_description = "Change owner of specified datablock"
|
||||
bl_label = "Change modification rights"
|
||||
bl_description = "Modify the owner of the target datablock"
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
key: bpy.props.StringProperty(default="None")
|
||||
recursive: bpy.props.BoolProperty(default=True)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
@ -411,14 +413,20 @@ class SessionPropertyRightOperator(bpy.types.Operator):
|
||||
layout = self.layout
|
||||
runtime_settings = context.window_manager.session
|
||||
|
||||
col = layout.column()
|
||||
col.prop(runtime_settings, "clients")
|
||||
row = layout.row()
|
||||
row.label(text="Give the owning rights to:")
|
||||
row.prop(runtime_settings, "clients", text="")
|
||||
row = layout.row()
|
||||
row.label(text="Affect dependencies")
|
||||
row.prop(self, "recursive", text="")
|
||||
|
||||
def execute(self, context):
|
||||
runtime_settings = context.window_manager.session
|
||||
|
||||
if session:
|
||||
session.change_owner(self.key, runtime_settings.clients)
|
||||
session.change_owner(self.key,
|
||||
runtime_settings.clients,
|
||||
recursive=self.recursive)
|
||||
|
||||
return {"FINISHED"}
|
||||
|
||||
@ -551,8 +559,9 @@ class SessionSnapTimeOperator(bpy.types.Operator):
|
||||
|
||||
class SessionApply(bpy.types.Operator):
|
||||
bl_idname = "session.apply"
|
||||
bl_label = "apply selected block into blender"
|
||||
bl_description = "Apply selected block into blender"
|
||||
bl_label = "Revert"
|
||||
bl_description = "Revert the selected datablock from his cached" + \
|
||||
" version."
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
target: bpy.props.StringProperty()
|
||||
@ -573,8 +582,8 @@ class SessionApply(bpy.types.Operator):
|
||||
|
||||
class SessionCommit(bpy.types.Operator):
|
||||
bl_idname = "session.commit"
|
||||
bl_label = "commit and push selected datablock to server"
|
||||
bl_description = "commit and push selected datablock to server"
|
||||
bl_label = "Force server update"
|
||||
bl_description = "Commit and push the target datablock to server"
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
target: bpy.props.StringProperty()
|
||||
|
@ -34,9 +34,9 @@ ICONS_PROP_STATES = ['TRIA_DOWN', # ADDED
|
||||
'TRIA_UP', # COMMITED
|
||||
'KEYTYPE_KEYFRAME_VEC', # PUSHED
|
||||
'TRIA_DOWN', # FETCHED
|
||||
'FILE_REFRESH', # UP
|
||||
'TRIA_UP',
|
||||
'ERROR'] # CHANGED
|
||||
'RECOVER_LAST', # RESET
|
||||
'TRIA_UP', # CHANGED
|
||||
'ERROR'] # ERROR
|
||||
|
||||
|
||||
def printProgressBar(iteration, total, prefix='', suffix='', decimals=1, length=100, fill='█', fill_empty=' '):
|
||||
@ -492,10 +492,12 @@ def draw_property(context, parent, property_uuid, level=0):
|
||||
detail_item_box.separator()
|
||||
|
||||
if item.state in [FETCHED, UP]:
|
||||
detail_item_box.operator(
|
||||
apply = detail_item_box.operator(
|
||||
"session.apply",
|
||||
text="",
|
||||
icon=ICONS_PROP_STATES[item.state]).target = item.uuid
|
||||
icon=ICONS_PROP_STATES[item.state])
|
||||
apply.target = item.uuid
|
||||
apply.reset_dependencies = True
|
||||
elif item.state in [MODIFIED, ADDED]:
|
||||
detail_item_box.operator(
|
||||
"session.commit",
|
||||
|
@ -7,13 +7,12 @@ import bpy
|
||||
from multi_user.bl_types.bl_material import BlMaterial
|
||||
|
||||
|
||||
def test_material(clear_blend):
|
||||
def test_material_nodes(clear_blend):
|
||||
nodes_types = [node.bl_rna.identifier for node in bpy.types.ShaderNode.__subclasses__()]
|
||||
|
||||
|
||||
datablock = bpy.data.materials.new("test")
|
||||
datablock.use_nodes = True
|
||||
bpy.data.materials.create_gpencil_data(datablock)
|
||||
|
||||
|
||||
for ntype in nodes_types:
|
||||
datablock.node_tree.nodes.new(ntype)
|
||||
|
||||
@ -26,3 +25,18 @@ def test_material(clear_blend):
|
||||
result = implementation._dump(test)
|
||||
|
||||
assert not DeepDiff(expected, result)
|
||||
|
||||
|
||||
def test_material_gpencil(clear_blend):
|
||||
datablock = bpy.data.materials.new("test")
|
||||
bpy.data.materials.create_gpencil_data(datablock)
|
||||
|
||||
implementation = BlMaterial()
|
||||
expected = implementation._dump(datablock)
|
||||
bpy.data.materials.remove(datablock)
|
||||
|
||||
test = implementation._construct(expected)
|
||||
implementation._load(expected, test)
|
||||
result = implementation._dump(test)
|
||||
|
||||
assert not DeepDiff(expected, result)
|
||||
|
Loading…
Reference in New Issue
Block a user