Improve proxy tools

This commit is contained in:
Lubos Lenco 2017-10-17 13:39:50 +02:00
parent c5284b73a6
commit 7e763d78fb
4 changed files with 110 additions and 91 deletions

View file

@ -228,6 +228,8 @@ def on_load_post(context):
props.init_properties_on_load()
make_renderer.reload_blend_data()
bpy.ops.arm.sync_proxy()
wrd = bpy.data.worlds['Arm']
wrd.arm_recompile = True

View file

@ -9,6 +9,7 @@ import arm.utils
import arm.make
import arm.make_renderer as make_renderer
import arm.props_renderpath as props_renderpath
import arm.proxy
try:
import barmory
except ImportError:
@ -38,6 +39,42 @@ def update_mat_cache(self, context):
else:
pass
def proxy_sync_loc(self, context):
if context.object == None or context.object.proxy == None:
return
if context.object.arm_proxy_sync_loc:
arm.proxy.sync_location(context.object)
def proxy_sync_rot(self, context):
if context.object == None or context.object.proxy == None:
return
if context.object.arm_proxy_sync_rot:
arm.proxy.sync_rotation(context.object)
def proxy_sync_scale(self, context):
if context.object == None or context.object.proxy == None:
return
if context.object.arm_proxy_sync_scale:
arm.proxy.sync_scale(context.object)
def proxy_sync_materials(self, context):
if context.object == None or context.object.proxy == None:
return
if context.object.arm_proxy_sync_materials:
arm.proxy.sync_materials(context.object)
def proxy_sync_modifiers(self, context):
if context.object == None or context.object.proxy == None:
return
if context.object.arm_proxy_sync_modifiers:
arm.proxy.sync_modifiers(context.object)
def proxy_sync_traits(self, context):
if context.object == None or context.object.proxy == None:
return
if context.object.arm_proxy_sync_traits:
arm.proxy.sync_traits(context.object)
def init_properties():
global arm_version
bpy.types.World.arm_recompile = bpy.props.BoolProperty(name="Recompile", description="Recompile sources on next play", default=True)
@ -132,7 +169,12 @@ def init_properties():
bpy.types.Object.arm_animation_enabled = bpy.props.BoolProperty(name="Animation", description="Enable skinning & timeline animation", default=True)
bpy.types.Object.arm_tilesheet = bpy.props.StringProperty(name="Tilesheet", description="Set tilesheet animation", default='')
bpy.types.Object.arm_tilesheet_action = bpy.props.StringProperty(name="Tilesheet Action", description="Set startup action", default='')
bpy.types.Object.arm_proxy_sync = bpy.props.BoolProperty(name="Sync", description="Sycnhronize changes with all proxy instances", default=False)
bpy.types.Object.arm_proxy_sync_loc = bpy.props.BoolProperty(name="Location", description="Keep location synchronized with proxy object", default=False, update=proxy_sync_loc)
bpy.types.Object.arm_proxy_sync_rot = bpy.props.BoolProperty(name="Rotation", description="Keep rotation synchronized with proxy object", default=False, update=proxy_sync_rot)
bpy.types.Object.arm_proxy_sync_scale = bpy.props.BoolProperty(name="Scale", description="Keep scale synchronized with proxy object", default=False, update=proxy_sync_scale)
bpy.types.Object.arm_proxy_sync_materials = bpy.props.BoolProperty(name="Materials", description="Keep materials synchronized with proxy object", default=False, update=proxy_sync_materials)
bpy.types.Object.arm_proxy_sync_modifiers = bpy.props.BoolProperty(name="Modifiers", description="Keep modifiers synchronized with proxy object", default=False, update=proxy_sync_modifiers)
bpy.types.Object.arm_proxy_sync_traits = bpy.props.BoolProperty(name="Traits", description="Keep traits synchronized with proxy object", default=False, update=proxy_sync_traits)
# For speakers
bpy.types.Speaker.arm_loop = bpy.props.BoolProperty(name="Loop", description="Loop this sound", default=False)
bpy.types.Speaker.arm_stream = bpy.props.BoolProperty(name="Stream", description="Stream this sound", default=False)

View file

@ -1259,20 +1259,20 @@ class ArmProxyPanel(bpy.types.Panel):
layout.operator("arm.make_proxy")
obj = bpy.context.object
if obj != None and obj.proxy != None:
layout.label("Reset")
layout.label("Sync")
col = layout.column(align=True)
col.alignment = 'EXPAND'
row = col.row(align=True)
row.alignment = 'EXPAND'
row.operator("arm.reset_proxy_loc")
row.operator("arm.reset_proxy_rot")
row.operator("arm.reset_proxy_scale")
row.prop(obj, "arm_proxy_sync_loc")
row.prop(obj, "arm_proxy_sync_rot")
row.prop(obj, "arm_proxy_sync_scale")
row = col.row(align=True)
row.prop(obj, "arm_proxy_sync_materials")
row.prop(obj, "arm_proxy_sync_modifiers")
row.prop(obj, "arm_proxy_sync_traits")
row = layout.row(align=True)
row.alignment = 'EXPAND'
row.operator("arm.reset_proxy_materials")
row.operator("arm.reset_proxy_modifiers")
row.operator("arm.reset_proxy_traits")
layout.prop(obj, "arm_proxy_sync")
row.operator("arm.proxy_toggle")
row.operator("arm.proxy_apply_all")
class ArmMakeProxyButton(bpy.types.Operator):
'''Create proxy from linked object'''
@ -1288,76 +1288,55 @@ class ArmMakeProxyButton(bpy.types.Operator):
arm.proxy.make(obj)
return{'FINISHED'}
class ArmResetProxyLocButton(bpy.types.Operator):
bl_idname = 'arm.reset_proxy_loc'
bl_label = 'Location'
class ArmProxyToggleButton(bpy.types.Operator):
bl_idname = 'arm.proxy_toggle'
bl_label = 'Toggle'
def execute(self, context):
if context.object.arm_proxy_sync:
for obj in bpy.data.objects:
if obj.proxy == context.object.proxy:
arm.proxy.reset_location(obj)
else:
arm.proxy.reset_location(context.object)
obj = context.object
b = not obj.arm_proxy_sync_loc
obj.arm_proxy_sync_loc = b
obj.arm_proxy_sync_rot = b
obj.arm_proxy_sync_scale = b
obj.arm_proxy_sync_materials = b
obj.arm_proxy_sync_modifiers = b
obj.arm_proxy_sync_traits = b
return{'FINISHED'}
class ArmResetProxyRotButton(bpy.types.Operator):
bl_idname = 'arm.reset_proxy_rot'
bl_label = 'Rotation'
class ArmProxyApplyAllButton(bpy.types.Operator):
bl_idname = 'arm.proxy_apply_all'
bl_label = 'Apply to All'
def execute(self, context):
if context.object.arm_proxy_sync:
for obj in bpy.data.objects:
if obj.proxy == context.object.proxy:
arm.proxy.reset_rotation(obj)
else:
arm.proxy.reset_rotation(context.object)
for obj in bpy.data.objects:
if obj.proxy == None:
continue
if obj.proxy == context.object.proxy:
obj.arm_proxy_sync_loc = context.object.arm_proxy_sync_loc
obj.arm_proxy_sync_rot = context.object.arm_proxy_sync_rot
obj.arm_proxy_sync_scale = context.object.arm_proxy_sync_scale
obj.arm_proxy_sync_materials = context.object.arm_proxy_sync_materials
obj.arm_proxy_sync_modifiers = context.object.arm_proxy_sync_modifiers
obj.arm_proxy_sync_traits = context.object.arm_proxy_sync_traits
return{'FINISHED'}
class ArmResetProxyScaleButton(bpy.types.Operator):
bl_idname = 'arm.reset_proxy_scale'
bl_label = 'Scale'
class ArmSyncProxyButton(bpy.types.Operator):
bl_idname = 'arm.sync_proxy'
bl_label = 'Sync'
def execute(self, context):
if context.object.arm_proxy_sync:
if len(bpy.data.libraries) > 0:
for obj in bpy.data.objects:
if obj.proxy == context.object.proxy:
arm.proxy.reset_scale(obj)
else:
arm.proxy.reset_scale(context.object)
return{'FINISHED'}
class ArmResetProxyMaterialsButton(bpy.types.Operator):
bl_idname = 'arm.reset_proxy_materials'
bl_label = 'Materials'
def execute(self, context):
if context.object.arm_proxy_sync:
for obj in bpy.data.objects:
if obj.proxy == context.object.proxy:
arm.proxy.reset_materials(obj)
else:
arm.proxy.reset_materials(context.object)
return{'FINISHED'}
class ArmResetProxyModifiersButton(bpy.types.Operator):
bl_idname = 'arm.reset_proxy_modifiers'
bl_label = 'Modifiers'
def execute(self, context):
if context.object.arm_proxy_sync:
for obj in bpy.data.objects:
if obj.proxy == context.object.proxy:
arm.proxy.reset_modifiers(obj)
else:
arm.proxy.reset_modifiers(context.object)
return{'FINISHED'}
class ArmResetProxyTraitsButton(bpy.types.Operator):
bl_idname = 'arm.reset_proxy_traits'
bl_label = 'Traits'
def execute(self, context):
if context.object.arm_proxy_sync:
for obj in bpy.data.objects:
if obj.proxy == context.object.proxy:
arm.proxy.reset_traits(obj)
else:
arm.proxy.reset_traits(context.object)
if obj.arm_proxy_sync_loc:
arm.proxy.sync_location(obj)
if obj.arm_proxy_sync_rot:
arm.proxy.sync_rotation(obj)
if obj.arm_proxy_sync_scale:
arm.proxy.sync_scale(obj)
if obj.arm_proxy_sync_materials:
arm.proxy.sync_materials(obj)
if obj.arm_proxy_sync_modifiers:
arm.proxy.sync_modifiers(obj)
if obj.arm_proxy_sync_traits:
arm.proxy.sync_traits(obj)
print('Armory: Proxy objects synchronized')
return{'FINISHED'}
def register():
@ -1403,12 +1382,9 @@ def register():
bpy.utils.register_class(ArmTilesheetPanel)
bpy.utils.register_class(ArmProxyPanel)
bpy.utils.register_class(ArmMakeProxyButton)
bpy.utils.register_class(ArmResetProxyLocButton)
bpy.utils.register_class(ArmResetProxyRotButton)
bpy.utils.register_class(ArmResetProxyScaleButton)
bpy.utils.register_class(ArmResetProxyMaterialsButton)
bpy.utils.register_class(ArmResetProxyModifiersButton)
bpy.utils.register_class(ArmResetProxyTraitsButton)
bpy.utils.register_class(ArmProxyToggleButton)
bpy.utils.register_class(ArmProxyApplyAllButton)
bpy.utils.register_class(ArmSyncProxyButton)
bpy.types.VIEW3D_HT_header.append(draw_view3d_header)
bpy.types.INFO_HT_header.prepend(draw_info_header)
@ -1459,9 +1435,6 @@ def unregister():
bpy.utils.unregister_class(ArmTilesheetPanel)
bpy.utils.unregister_class(ArmProxyPanel)
bpy.utils.unregister_class(ArmMakeProxyButton)
bpy.utils.unregister_class(ArmResetProxyLocButton)
bpy.utils.unregister_class(ArmResetProxyRotButton)
bpy.utils.unregister_class(ArmResetProxyScaleButton)
bpy.utils.unregister_class(ArmResetProxyMaterialsButton)
bpy.utils.unregister_class(ArmResetProxyModifiersButton)
bpy.utils.unregister_class(ArmResetProxyTraitsButton)
bpy.utils.unregister_class(ArmProxyToggleButton)
bpy.utils.unregister_class(ArmProxyApplyAllButton)
bpy.utils.unregister_class(ArmSyncProxyButton)

View file

@ -23,17 +23,19 @@ def traverse(obj):
c.parent = bpy.context.scene.objects.active
c.matrix_parent_inverse = bpy.context.scene.objects.active.matrix_world.inverted()
def reset_location(obj):
sync_modifiers(bpy.context.scene.objects.active)
def sync_location(obj):
obj.location = obj.proxy.location
def reset_rotation(obj):
def sync_rotation(obj):
obj.rotation_euler = obj.proxy.rotation_euler
def reset_scale(obj):
def sync_scale(obj):
obj.scale = obj.proxy.scale
# https://blender.stackexchange.com/questions/4878
def reset_modifiers(obj):
def sync_modifiers(obj):
proxy = obj.proxy
obj.modifiers.clear()
for mSrc in obj.proxy.modifiers:
@ -64,13 +66,13 @@ def sync_collection(cSrc, cDst):
for prop in properties:
setattr(mDst, prop, getattr(mSrc, prop))
def reset_traits(obj):
def sync_traits(obj):
sync_collection(obj.proxy.arm_traitlist, obj.arm_traitlist)
for i in range(0, len(obj.arm_traitlist)):
sync_collection(obj.proxy.arm_traitlist[i].arm_traitparamslist, obj.arm_traitlist[i].arm_traitparamslist)
sync_collection(obj.proxy.arm_traitlist[i].arm_traitpropslist, obj.arm_traitlist[i].arm_traitpropslist)
def reset_materials(obj):
def sync_materials(obj):
# Blender likes to crash here:(
proxy_mats = []
for slot in obj.proxy.material_slots: