multi-user/__init__.py

238 lines
6.5 KiB
Python
Raw Normal View History

2019-02-08 00:41:18 +08:00
bl_info = {
"name": "Multi-User",
"author": "CUBE CREATIVE",
"description": "",
"blender": (2, 80, 0),
"location": "",
"warning": "",
"category": "Collaboration"
2019-02-08 00:41:18 +08:00
}
2019-03-14 23:44:18 +08:00
2019-07-02 00:04:35 +08:00
import logging
import random
import sys
import os
import bpy
from . import environment
2019-08-08 21:35:43 +08:00
from . import utils
2019-08-22 16:58:54 +08:00
from bpy.app.handlers import persistent
DEPENDENCIES = {
"zmq",
"umsgpack",
2019-07-17 04:50:34 +08:00
"pyyaml"
}
2019-07-02 22:43:30 +08:00
2019-07-02 00:04:35 +08:00
logger = logging.getLogger(__name__)
2019-07-20 00:37:57 +08:00
logger.setLevel(logging.DEBUG)
# UTILITY FUNCTIONS
def client_list_callback(scene, context):
2019-08-14 21:57:07 +08:00
from . import operators
from .bl_types.bl_user import BlUser
2019-05-22 23:17:09 +08:00
items = [("Common", "Common", "")]
username = bpy.context.window_manager.session.username
2019-08-14 21:57:07 +08:00
cli = operators.client
if cli:
client_keys = cli.list(filter=BlUser)
for k in client_keys:
2019-08-14 21:57:07 +08:00
name = cli.get(k).buffer["name"]
name_desc = name
if name == username:
name_desc += " (self)"
items.append((name, name_desc, ""))
return items
def randomColor():
r = random.random()
v = random.random()
b = random.random()
return [r, v, b]
2019-07-02 00:04:35 +08:00
def save_session_config(self,context):
config = environment.load_config()
config["username"] = self.username
2019-07-02 00:04:35 +08:00
config["ip"] = self.ip
config["port"] = self.port
config["start_empty"] = self.start_empty
config["enable_presence"] = self.enable_presence
2019-07-02 00:14:48 +08:00
config["client_color"] = [self.client_color.r,self.client_color.g,self.client_color.b]
2019-07-20 00:22:02 +08:00
rep_type = {}
for bloc in self.supported_datablock:
2019-07-02 23:44:59 +08:00
config["replicated_types"][bloc.type_name] = bloc.is_replicated
# Generate ordered replicate types
2019-07-16 04:25:20 +08:00
environment.genererate_replicated_types()
# Save out the configuration file
2019-07-02 00:04:35 +08:00
environment.save_config(config)
class ReplicatedDatablock(bpy.types.PropertyGroup):
'''name = StringProperty() '''
2019-07-02 22:43:30 +08:00
type_name: bpy.props.StringProperty()
is_replicated: bpy.props.BoolProperty()
class SessionProps(bpy.types.PropertyGroup):
2019-05-16 00:37:14 +08:00
username: bpy.props.StringProperty(
name="Username",
default="user_{}".format(utils.random_string_digits()),
2019-07-02 00:04:35 +08:00
update=save_session_config
)
2019-05-16 00:37:14 +08:00
ip: bpy.props.StringProperty(
name="ip",
description='Distant host ip',
2019-07-02 00:04:35 +08:00
default="127.0.0.1",
update=save_session_config
)
user_uuid: bpy.props.StringProperty(
name="user_uuid",
default="None"
)
2019-05-16 00:37:14 +08:00
port: bpy.props.IntProperty(
name="port",
description='Distant host port',
2019-07-02 00:04:35 +08:00
default=5555,
update=save_session_config
)
2019-05-16 00:37:14 +08:00
add_property_depth: bpy.props.IntProperty(
name="add_property_depth",
2019-07-02 00:04:35 +08:00
default=1
)
outliner_filter: bpy.props.StringProperty(name="None")
2019-05-16 00:37:14 +08:00
is_admin: bpy.props.BoolProperty(name="is_admin", default=False)
init_scene: bpy.props.BoolProperty(name="init_scene", default=True)
2019-07-02 00:14:48 +08:00
start_empty: bpy.props.BoolProperty(
name="start_empty",
default=False,
update=save_session_config)
2019-05-16 00:37:14 +08:00
active_object: bpy.props.PointerProperty(
name="active_object", type=bpy.types.Object)
2019-05-16 00:37:14 +08:00
session_mode: bpy.props.EnumProperty(
name='session_mode',
description='session mode',
items={
('HOST', 'hosting', 'host a session'),
('CONNECT', 'connexion', 'connect to a session')},
default='HOST')
2019-05-16 00:37:14 +08:00
client_color: bpy.props.FloatVectorProperty(
name="client_instance_color",
subtype='COLOR',
default=randomColor(),
update=save_session_config)
2019-05-16 00:37:14 +08:00
clients: bpy.props.EnumProperty(
name="clients",
description="client enum",
items=client_list_callback)
2019-07-02 00:04:35 +08:00
enable_presence: bpy.props.BoolProperty(
name="enable_presence",
description='Enable overlay drawing module',
2019-07-02 00:04:35 +08:00
default=True,
update=save_session_config
)
supported_datablock: bpy.props.CollectionProperty(
2019-07-02 23:44:59 +08:00
type=ReplicatedDatablock,
)
2019-07-02 00:04:35 +08:00
def load(self):
config = environment.load_config()
logger.info(config)
if "username" in config:
2019-07-02 00:04:35 +08:00
self.username = config["username"]
self.ip = config["ip"]
self.port = config["port"]
self.start_empty = config["start_empty"]
self.enable_presence = config["enable_presence"]
2019-07-02 22:43:30 +08:00
self.client_color = config["client_color"]
2019-07-02 00:04:35 +08:00
else:
logger.error("Fail to read user config")
2019-07-02 22:43:30 +08:00
if len(self.supported_datablock)>0:
self.supported_datablock.clear()
2019-07-03 21:03:37 +08:00
2019-07-02 23:44:59 +08:00
for datablock,enabled in config["replicated_types"].items():
rep_value = self.supported_datablock.add()
2019-07-03 21:03:37 +08:00
rep_value.name = datablock
2019-07-02 22:43:30 +08:00
rep_value.type_name = datablock
rep_value.is_replicated = enabled
2019-07-02 23:44:59 +08:00
def save(self,context):
config = environment.load_config()
config["username"] = self.username
config["ip"] = self.ip
config["port"] = self.port
config["start_empty"] = self.start_empty
config["enable_presence"] = self.enable_presence
config["client_color"] = [self.client_color.r,self.client_color.g,self.client_color.b]
2019-07-03 21:03:37 +08:00
2019-07-02 23:44:59 +08:00
for bloc in self.supported_datablock:
config["replicated_types"][bloc.type_name] = bloc.is_replicated
environment.save_config(config)
2019-07-02 22:43:30 +08:00
classes = (
ReplicatedDatablock,
2019-08-08 21:35:43 +08:00
SessionProps,
2019-07-02 22:43:30 +08:00
)
2019-08-05 22:48:46 +08:00
libs = os.path.dirname(os.path.abspath(__file__))+"\\libs\\replication"
@persistent
def load_handler(dummy):
import bpy
bpy.context.window_manager.session.load()
# Generate ordered replicate types
2019-07-09 05:24:08 +08:00
save_session_config(bpy.context.window_manager.session,bpy.context)
2019-05-23 22:49:32 +08:00
def register():
2019-08-05 22:48:46 +08:00
if libs not in sys.path:
sys.path.append(libs)
print(libs)
2019-07-02 00:04:35 +08:00
environment.setup(DEPENDENCIES,bpy.app.binary_path_python)
2019-05-16 00:37:14 +08:00
from . import operators
from . import ui
for cls in classes:
bpy.utils.register_class(cls)
bpy.types.WindowManager.session = bpy.props.PointerProperty(
type=SessionProps)
2019-08-09 00:12:13 +08:00
bpy.types.ID.uuid = bpy.props.StringProperty(default="")
2019-07-02 00:04:35 +08:00
bpy.context.window_manager.session.load()
2019-07-02 23:44:59 +08:00
save_session_config(bpy.context.window_manager.session,bpy.context)
2019-04-10 23:01:21 +08:00
operators.register()
ui.register()
2019-02-08 00:41:18 +08:00
def unregister():
2019-05-16 00:37:14 +08:00
from . import operators
from . import ui
2019-04-10 23:01:21 +08:00
ui.unregister()
operators.unregister()
del bpy.types.WindowManager.session
2019-07-02 22:43:30 +08:00
for cls in reversed(classes):
bpy.utils.unregister_class(cls)