diff --git a/Assets/avatar-example/mesh/blend~/add_setup_triplanar.py b/Assets/avatar-example/mesh/blend~/add_setup_triplanar.py new file mode 100644 index 0000000..fda7502 --- /dev/null +++ b/Assets/avatar-example/mesh/blend~/add_setup_triplanar.py @@ -0,0 +1,72 @@ +from math import pi + +import bpy +from bpy.types import Context, Operator + + +def create_triplanar_setup(context: Context) -> None: + """ + Creates triplanar setup - a mesh cube with UVProject modifier and 6 UV projectors + + :param context: Current context + :type context: bpy.types.Context + """ + bpy.ops.object.empty_add(type='CUBE', radius=1.6, location=(1.6, 1.6, 1.6), rotation=(0, 0, 0)) + anchor_empty = context.active_object + anchor_empty.name = "UV_anchor" + + bpy.ops.mesh.primitive_cube_add(radius=1, calc_uvs=True) + cube_obj = context.active_object + + bpy.ops.object.modifier_add(type='UV_PROJECT') + uv_mod = cube_obj.modifiers["UVProject"] + + rotations_list = [ + ("top", (0, 0, 0)), + ("front", (pi/2, 0, 0)), + ("back", (pi/2, 0, pi)), + ("left", (pi/2, 0, pi/2)), + ("right", (pi/2, 0, -pi/2)), + ("bottom", (pi, 0, 0)), + ] + + uv_mod.projector_count = len(rotations_list) + + for i, (name, rotation) in enumerate(rotations_list): + bpy.ops.object.empty_add(type='SINGLE_ARROW', radius=1.6, location=(0, 0, 0), rotation=rotation) + uv_projector = context.active_object + uv_projector.name = "UV_%s" % name + uv_projector.parent = anchor_empty + uv_mod.projectors[i].object = uv_projector + + +class MESH_OT_AddTriplanarSetup(Operator): + bl_idname = "mesh.setup_triplanar_add" + bl_label = "Triplanar UV Setup" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context: Context): + try: + create_triplanar_setup(context) + except Exception as e: + self.report({'ERROR'}, str(e)) + return {'CANCELLED'} + return {'FINISHED'} + + +def draw_triplanar_setup(self, context): + self.layout.operator(MESH_OT_AddTriplanarSetup.bl_idname, icon='MOD_UVPROJECT') + + +def register(): + bpy.utils.register_class(MESH_OT_AddTriplanarSetup) + if draw_triplanar_setup.__name__ not in [f.__name__ for f in bpy.types.INFO_MT_mesh_add._dyn_ui_initialize()]: + bpy.types.INFO_MT_mesh_add.append(draw_triplanar_setup) + + +def unregister(): + bpy.types.INFO_MT_mesh_add.remove(draw_triplanar_setup) + bpy.utils.unregister_class(MESH_OT_AddTriplanarSetup) + + +register() diff --git a/Assets/avatar-example/mesh/blend~/example_2.79.blend b/Assets/avatar-example/mesh/blend~/example_2.79.blend index dfb80d8..21b3983 100644 --- a/Assets/avatar-example/mesh/blend~/example_2.79.blend +++ b/Assets/avatar-example/mesh/blend~/example_2.79.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c797285f8c1bdb5c4c910d4cc52d59aa59e8b26b3fa7cabdce4ae9a5e00d73a -size 684176 +oid sha256:2fe03a5a39bbf3d432b799c5914f6c8c2a1282d0b8fd88c72ef8d59452be74c2 +size 720576