Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts/startup/bl_operators/object.py')
-rw-r--r--release/scripts/startup/bl_operators/object.py151
1 files changed, 151 insertions, 0 deletions
diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py
index e5e53d6a4dc..3218af06cc7 100644
--- a/release/scripts/startup/bl_operators/object.py
+++ b/release/scripts/startup/bl_operators/object.py
@@ -775,3 +775,154 @@ class DupliOffsetFromCursor(Operator):
ob.users_group[group].dupli_offset = scene.cursor_location
return {'FINISHED'}
+
+
+class LodByName(Operator):
+ """Add levels of detail to this object based on object names"""
+ bl_idname = "object.lod_by_name"
+ bl_label = "Setup Levels of Detail By Name"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ return (context.active_object is not None)
+
+ def execute(self, context):
+ scene = context.scene
+ ob = context.active_object
+
+ prefix = ""
+ suffix = ""
+ name = ""
+ if ob.name.lower().startswith("lod0"):
+ prefix = ob.name[:4]
+ name = ob.name[4:]
+ elif ob.name.lower().endswith("lod0"):
+ name = ob.name[:-4]
+ suffix = ob.name[-4:]
+ else:
+ return {'CANCELLED'}
+
+ level = 0
+ while True:
+ level += 1
+
+ if prefix:
+ prefix = prefix[:3] + str(level)
+ if suffix:
+ suffix = suffix[:3] + str(level)
+
+ lod = None
+ try:
+ lod = bpy.data.objects[prefix + name + suffix]
+ except KeyError:
+ break
+
+ try:
+ ob.lod_levels[level]
+ except IndexError:
+ bpy.ops.object.lod_add()
+
+ ob.lod_levels[level].object = lod
+
+ return {'FINISHED'}
+
+
+class LodClearAll(Operator):
+ """Remove all levels of detail from this object"""
+ bl_idname = "object.lod_clear_all"
+ bl_label = "Clear All Levels of Detail"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ return (context.active_object is not None)
+
+ def execute(self, context):
+ scene = context.scene
+ ob = context.active_object
+
+ if ob.lod_levels:
+ while 'CANCELLED' not in bpy.ops.object.lod_remove():
+ pass
+
+ return {'FINISHED'}
+
+
+class LodGenerate(Operator):
+ """Generates levels of detail using the decimate modifier"""
+ bl_idname = "object.lod_generate"
+ bl_label = "Generate Levels of Detail"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ count = bpy.props.IntProperty(name="Count", default=3)
+ target = bpy.props.FloatProperty(name="Target Size", default=0.1,
+ min=0.0, max=1.0)
+ package = bpy.props.BoolProperty(name="Package into Group", default=False)
+
+ @classmethod
+ def poll(cls, context):
+ return (context.active_object is not None)
+
+ def execute(self, context):
+ scene = bpy.context.scene
+ ob = scene.objects.active
+
+ lod_name = ob.name
+ lod_suffix = "lod"
+ lod_prefix = ""
+ if lod_name.lower().endswith("lod0"):
+ lod_suffix = lod_name[-3:-1]
+ lod_name = lod_name[:-3]
+ elif lod_name.lower().startswith("lod0"):
+ lod_suffix = ""
+ lod_prefix = lod_name[:3]
+ lod_name = lod_name[4:]
+
+ group_name = lod_name.strip(' ._')
+ if self.package:
+ try:
+ bpy.ops.object.group_link(group=group_name)
+ except TypeError:
+ bpy.ops.group.create(name=group_name)
+
+ step = (1.0 - self.target) / (self.count - 1)
+ for i in range(1, self.count):
+ scene.objects.active = ob
+ bpy.ops.object.duplicate()
+ lod = bpy.context.selected_objects[0]
+
+ scene.objects.active = ob
+ bpy.ops.object.lod_add()
+ scene.objects.active = lod
+
+ if lod_prefix:
+ lod.name = lod_prefix + str(i) + lod_name
+ else:
+ lod.name = lod_name + lod_suffix + str(i)
+
+ lod.location.y = ob.location.y + 3.0 * i
+
+ if i == 1:
+ modifier = lod.modifiers.new("lod_decimate", "DECIMATE")
+ else:
+ modifier = lod.modifiers[-1]
+
+ modifier.ratio = 1.0 - step*(i)
+
+ ob.lod_levels[i].object = lod
+
+ if self.package:
+ bpy.ops.object.group_link(group=group_name)
+ lod.parent = ob
+
+ if self.package:
+ for level in ob.lod_levels[1:]:
+ level.object.hide = level.object.hide_render = True
+
+ lod.select = False
+ ob.select = True
+ scene.objects.active = ob
+
+ return {'FINISHED'}
+