Merged changes in the trunk up to revision 31190.
[blender.git] / release / scripts / ui / properties_render.py
index cd11179dc2577976be87241a1a6245e801be10a6..6856e73dc2f59286623de93d043164dadc2b4ff3 100644 (file)
@@ -119,11 +119,12 @@ class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel):
         col.prop(rl, "solid")
         col.prop(rl, "halo")
         col.prop(rl, "ztransp")
-
-        col = split.column()
         col.prop(rl, "sky")
+               
+        col = split.column()
         col.prop(rl, "edge")
         col.prop(rl, "strand")
+        col.prop(rl, "freestyle")
 
         layout.separator()
 
@@ -169,6 +170,254 @@ class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel):
         row.prop(rl, "pass_refraction_exclude", text="")
 
 
+class RENDER_PT_freestyle(RenderButtonsPanel, bpy.types.Panel):
+    bl_label = "Freestyle"
+    COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+    @classmethod
+    def poll(cls, context):
+        rd = context.scene.render
+        rl = rd.layers[rd.active_layer_index]
+        return rl and rl.freestyle
+
+    def draw(self, context):
+        layout = self.layout
+
+        rd = context.scene.render
+        rl = rd.layers[rd.active_layer_index]
+        freestyle = rl.freestyle_settings
+
+        split = layout.split()
+
+        col = split.column()
+        col.prop(freestyle, "mode", text="Control Mode")
+
+        if freestyle.mode == "EDITOR":
+            col.label(text="Edge Detection Options:")
+            col.prop(freestyle, "crease_angle")
+            col.prop(freestyle, "sphere_radius")
+            col.prop(freestyle, "dkr_epsilon")
+
+            lineset = freestyle.active_lineset
+
+            col.label(text="Line Sets:")
+            row = col.row()
+            rows = 2
+            if lineset:
+                rows = 5
+            # FIXME: scrollbar does not work correctly
+            row.template_list(freestyle, "linesets", freestyle, "active_lineset_index", rows=rows)
+
+            sub = row.column()
+            subsub = sub.column(align=True)
+            subsub.operator("scene.freestyle_lineset_add", icon='ZOOMIN', text="")
+            subsub.operator("scene.freestyle_lineset_remove", icon='ZOOMOUT', text="")
+            if lineset:
+                sub.separator()
+                subsub = sub.column(align=True)
+                subsub.operator("scene.freestyle_lineset_move", icon='TRIA_UP', text="").direction = 'UP'
+                subsub.operator("scene.freestyle_lineset_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+
+            if lineset:
+                col.prop(lineset, "name")
+                col.prop(lineset, "select_by_visibility")
+                col.prop(lineset, "select_by_edge_types")
+
+                if lineset.select_by_visibility:
+                    col.label(text="Visibility:")
+                    sub = col.row(align=True)
+                    sub.prop(lineset, "visibility", expand=True)
+                    if lineset.visibility == "RANGE":
+                        sub = col.row(align=True)
+                        sub.prop(lineset, "qi_start")
+                        sub.prop(lineset, "qi_end")
+
+                if lineset.select_by_edge_types:
+                    col.label(text="Edge Types:")
+                    row = col.row()
+                    row.prop(lineset, "edge_type_negation", expand=True)
+                    row = col.row()
+                    row.prop(lineset, "edge_type_combination", expand=True)
+
+                    row = col.row()
+                    sub = row.column()
+                    sub.prop(lineset, "select_silhouette")
+                    sub.prop(lineset, "select_border")
+                    sub.prop(lineset, "select_crease")
+                    sub.prop(lineset, "select_ridge")
+                    sub.prop(lineset, "select_valley")
+                    sub.prop(lineset, "select_suggestive_contour")
+                    sub.prop(lineset, "select_material_boundary")
+                    sub = row.column()
+                    sub.prop(lineset, "select_contour")
+                    sub.prop(lineset, "select_external_contour")
+
+        else: # freestyle.mode == "SCRIPT"
+
+            col.prop(freestyle, "crease_angle")
+            col.prop(freestyle, "sphere_radius")
+            col.prop(freestyle, "ridges_and_valleys")
+            col.prop(freestyle, "suggestive_contours")
+            sub = col.row()
+            sub.prop(freestyle, "dkr_epsilon")
+            sub.active = freestyle.suggestive_contours
+            col.prop(freestyle, "material_boundaries")
+            col.operator("scene.freestyle_module_add")
+
+            for i, module in enumerate(freestyle.modules):
+                    box = layout.box()
+                    box.set_context_pointer("freestyle_module", module)
+                    row = box.row(align=True)
+                    row.prop(module, "is_displayed", text="")
+                    row.prop(module, "module_path", text="")
+                    row.operator("scene.freestyle_module_remove", icon='X', text="")
+                    row.operator("scene.freestyle_module_move", icon='TRIA_UP', text="").direction = 'UP'
+                    row.operator("scene.freestyle_module_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+
+
+class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, bpy.types.Panel):
+    bl_label = "Freestyle: Line Style"
+    COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+    @classmethod
+    def poll(cls, context):
+        rd = context.scene.render
+        rl = rd.layers[rd.active_layer_index]
+        if rl and rl.freestyle:
+            freestyle = rl.freestyle_settings
+            return freestyle.mode == "EDITOR" and freestyle.active_lineset
+        return False
+
+    def draw_modifier_box_header(self, box, modifier):
+        row = box.row()
+        row.set_context_pointer("modifier", modifier)
+        if modifier.expanded:
+            icon = "TRIA_DOWN"
+        else:
+            icon = "TRIA_RIGHT"
+        row.operator("scene.freestyle_modifier_toggle_fold", icon=icon, text="", emboss=False)
+        row.label(text=modifier.rna_type.name)
+        row.prop(modifier, "name", text="")
+        row.prop(modifier, "enabled", text="")
+        sub = row.row(align=True)
+        sub.operator("scene.freestyle_modifier_move", icon='TRIA_UP', text="").direction = 'UP'
+        sub.operator("scene.freestyle_modifier_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+        row.operator("scene.freestyle_modifier_remove", icon='X', text="")
+
+    def draw_color_modifier(self, context, modifier):
+        layout = self.layout
+
+        col = layout.column(align=True)
+        self.draw_modifier_box_header(col.box(), modifier)
+        if modifier.expanded:
+            box = col.box()
+            row = box.row()
+            row.prop(modifier, "blend", text="")
+            row.prop(modifier, "influence")
+            if modifier.type == "DISTANCE_FROM_OBJECT":
+                box.prop(modifier, "target")
+            box.template_color_ramp(modifier, "color_ramp", expand=True)
+            if modifier.type not in ["ALONG_STROKE"]:
+                row = box.row(align=True)
+                row.prop(modifier, "range_min")
+                row.prop(modifier, "range_max")
+
+    def draw_alpha_modifier(self, context, modifier):
+        layout = self.layout
+
+        col = layout.column(align=True)
+        self.draw_modifier_box_header(col.box(), modifier)
+        if modifier.expanded:
+            box = col.box()
+            row = box.row()
+            row.prop(modifier, "blend", text="")
+            row.prop(modifier, "influence")
+            if modifier.type == "DISTANCE_FROM_OBJECT":
+                box.prop(modifier, "target")
+            row = box.row()
+            row.prop(modifier, "mapping", text="")
+            sub = row.column()
+            sub.prop(modifier, "invert")
+            if modifier.mapping == "CURVE":
+                sub.enabled = False
+                box.template_curve_mapping(modifier, "curve")
+            if modifier.type not in ["ALONG_STROKE"]:
+                row = box.row(align=True)
+                row.prop(modifier, "range_min")
+                row.prop(modifier, "range_max")
+
+    def draw_thickness_modifier(self, context, modifier):
+        layout = self.layout
+
+        col = layout.column(align=True)
+        self.draw_modifier_box_header(col.box(), modifier)
+        if modifier.expanded:
+            box = col.box()
+            row = box.row()
+            row.prop(modifier, "blend", text="")
+            row.prop(modifier, "influence")
+            if modifier.type == "DISTANCE_FROM_OBJECT":
+                box.prop(modifier, "target")
+            row = box.row()
+            row.prop(modifier, "mapping", text="")
+            sub = row.column()
+            sub.prop(modifier, "invert")
+            if modifier.mapping == "CURVE":
+                sub.enabled = False
+                box.template_curve_mapping(modifier, "curve")
+            if modifier.type not in ["ALONG_STROKE"]:
+                row = box.row(align=True)
+                row.prop(modifier, "range_min")
+                row.prop(modifier, "range_max")
+            row = box.row(align=True)
+            row.prop(modifier, "value_min")
+            row.prop(modifier, "value_max")
+
+    def draw(self, context):
+        layout = self.layout
+
+        rd = context.scene.render
+        rl = rd.layers[rd.active_layer_index]
+        lineset = rl.freestyle_settings.active_lineset
+        linestyle = lineset.linestyle
+
+        split = layout.split()
+        col = split.column()
+        col.template_ID(lineset, "linestyle", new="scene.freestyle_linestyle_new")
+
+        col.separator()
+        sub = col.row(align=True)
+        sub.prop(linestyle, "panel", expand=True)
+
+        if linestyle.panel == "COLOR":
+            col.label(text="Base Color:")
+            col.prop(linestyle, "color", text="")
+            col.label(text="Modifiers:")
+            layout.operator_menu_enum("scene.freestyle_color_modifier_add", "type", text="Add Modifier")
+            for modifier in linestyle.color_modifiers:
+                self.draw_color_modifier(context, modifier)
+        elif linestyle.panel == "ALPHA":
+            col.label(text="Base Transparency:")
+            col.prop(linestyle, "alpha")
+            col.label(text="Modifiers:")
+            layout.operator_menu_enum("scene.freestyle_alpha_modifier_add", "type", text="Add Modifier")
+            for modifier in linestyle.alpha_modifiers:
+                self.draw_alpha_modifier(context, modifier)
+        elif linestyle.panel == "THICKNESS":
+            col.label(text="Base Thickness:")
+            col.prop(linestyle, "thickness")
+            col.label(text="Modifiers:")
+            layout.operator_menu_enum("scene.freestyle_thickness_modifier_add", "type", text="Add Modifier")
+            for modifier in linestyle.thickness_modifiers:
+                self.draw_thickness_modifier(context, modifier)
+        elif linestyle.panel == "STROKES":
+            pass
+        elif linestyle.panel == "DISTORT":
+            pass
+        elif linestyle.panel == "MISC":
+            pass
+
+
 class RENDER_PT_shading(RenderButtonsPanel, bpy.types.Panel):
     bl_label = "Shading"
     COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -272,6 +521,12 @@ class RENDER_PT_post_processing(RenderButtonsPanel, bpy.types.Panel):
         sub.prop(rd, "edge_threshold", text="Threshold", slider=True)
         sub.prop(rd, "edge_color", text="")
 
+        layout.separator()
+
+        split = layout.split()
+        col = split.column()
+        col.prop(rd, "freestyle", text="Freestyle")
+
 
 class RENDER_PT_output(RenderButtonsPanel, bpy.types.Panel):
     bl_label = "Output"
@@ -603,26 +858,26 @@ class RENDER_PT_bake(RenderButtonsPanel, bpy.types.Panel):
         rd = context.scene.render
 
         layout.operator("object.bake_image", icon='RENDER_STILL')
-
+        
         layout.prop(rd, "bake_type")
-
+        
         if rd.bake_type == 'NORMALS':
             layout.prop(rd, "bake_normal_space")
         elif rd.bake_type in ('DISPLACEMENT', 'AO'):
             layout.prop(rd, "bake_normalized")
-
+        
         # col.prop(rd, "bake_aa_mode")
         # col.prop(rd, "bake_enable_aa")
-
+        
         layout.separator()
-
+        
         split = layout.split()
 
         col = split.column()
         col.prop(rd, "bake_clear")
         col.prop(rd, "bake_margin")
         col.prop(rd, "bake_quad_split", text="Split")
-
+        
         col = split.column()
         col.prop(rd, "bake_active")
         sub = col.column()
@@ -630,7 +885,7 @@ class RENDER_PT_bake(RenderButtonsPanel, bpy.types.Panel):
         sub.prop(rd, "bake_distance")
         sub.prop(rd, "bake_bias")
 
-
+        
 def register():
     pass