Improve proxy tools
This commit is contained in:
parent
c5284b73a6
commit
7e763d78fb
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue