Merged changes in the trunk up to revision 39368.
[blender.git] / release / scripts / startup / bl_ui / properties_render.py
index fb14372ebeafc213c210ffcc59b37ff96dcc84f3..647455af03c98176c3394ef7675e96f1f2fd94f6 100644 (file)
@@ -123,11 +123,12 @@ class RENDER_PT_layers(RenderButtonsPanel, Panel):
         col.prop(rl, "use_solid")
         col.prop(rl, "use_halo")
         col.prop(rl, "use_ztransp")
+        col.prop(rl, "use_sky")
 
         col = split.column()
-        col.prop(rl, "use_sky")
         col.prop(rl, "use_edge_enhance")
         col.prop(rl, "use_strand")
+        col.prop(rl, "use_freestyle")
 
         layout.separator()
 
@@ -174,6 +175,344 @@ class RENDER_PT_layers(RenderButtonsPanel, Panel):
         row.prop(rl, "exclude_refraction", text="")
 
 
+class RENDER_PT_freestyle(RenderButtonsPanel, Panel):
+    bl_label = "Freestyle"
+    COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+    @classmethod
+    def poll(cls, context):
+        rd = context.scene.render
+        rl = rd.layers.active
+        return rl and rl.use_freestyle
+
+    def draw(self, context):
+        layout = self.layout
+
+        rd = context.scene.render
+        rl = rd.layers.active
+        freestyle = rl.freestyle_settings
+
+        split = layout.split()
+
+        col = split.column()
+        col.prop(freestyle, "raycasting_algorithm", text="Raycasting Algorithm")
+        col.prop(freestyle, "mode", text="Control Mode")
+
+        if freestyle.mode == "EDITOR":
+            col.label(text="Edge Detection Options:")
+            col.prop(freestyle, "use_smoothness")
+            col.prop(freestyle, "crease_angle")
+            col.prop(freestyle, "sphere_radius")
+            col.prop(freestyle, "kr_derivative_epsilon")
+
+            lineset = freestyle.linesets.active
+
+            col.label(text="Line Sets:")
+            row = col.row()
+            rows = 2
+            if lineset:
+                rows = 5
+            row.template_list(freestyle, "linesets", freestyle.linesets, "active_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")
+                if lineset.select_by_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")
+                    col.separator() # XXX
+
+                col.prop(lineset, "select_by_edge_types")
+                if lineset.select_by_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")
+                    col.separator() # XXX
+
+                col.prop(lineset, "select_by_group")
+                if lineset.select_by_group:
+                    col.prop(lineset, "group")
+                    row = col.row()
+                    row.prop(lineset, "group_negation", expand=True)
+                    col.separator() # XXX
+
+                col.prop(lineset, "select_by_image_border")
+
+        else: # freestyle.mode == "SCRIPT"
+
+            col.prop(freestyle, "use_smoothness")
+            col.prop(freestyle, "crease_angle")
+            col.prop(freestyle, "sphere_radius")
+            col.prop(freestyle, "use_ridges_and_valleys")
+            col.prop(freestyle, "use_suggestive_contours")
+            sub = col.row()
+            sub.prop(freestyle, "kr_derivative_epsilon")
+            sub.active = freestyle.use_suggestive_contours
+            col.prop(freestyle, "use_material_boundaries")
+            col.operator("scene.freestyle_module_add")
+
+            for i, module in enumerate(freestyle.modules):
+                box = layout.box()
+                box.context_pointer_set("freestyle_module", module)
+                row = box.row(align=True)
+                row.prop(module, "use", 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, Panel):
+    bl_label = "Freestyle: Line Style"
+    COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+    @classmethod
+    def poll(cls, context):
+        rd = context.scene.render
+        rl = rd.layers.active
+        if rl and rl.use_freestyle:
+            freestyle = rl.freestyle_settings
+            return freestyle.mode == "EDITOR" and freestyle.linesets.active
+        return False
+
+    def draw_modifier_box_header(self, box, modifier):
+        row = box.row()
+        row.context_pointer_set("modifier", modifier)
+        if modifier.expanded:
+            icon = "TRIA_DOWN"
+        else:
+            icon = "TRIA_RIGHT"
+        row.prop(modifier, "expanded", text="", icon=icon, emboss=False)
+        row.label(text=modifier.rna_type.name)
+        row.prop(modifier, "name", text="")
+        row.prop(modifier, "use", 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_modifier_common(self, box, modifier):
+        row = box.row()
+        row.prop(modifier, "blend", text="")
+        row.prop(modifier, "influence")
+
+    def draw_modifier_color_ramp_common(self, box, modifier, has_range):
+        box.template_color_ramp(modifier, "color_ramp", expand=True)
+        if has_range:
+            row = box.row(align=True)
+            row.prop(modifier, "range_min")
+            row.prop(modifier, "range_max")
+
+    def draw_modifier_curve_common(self, box, modifier, has_range, has_value):
+        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 has_range:
+            row = box.row(align=True)
+            row.prop(modifier, "range_min")
+            row.prop(modifier, "range_max")
+        if has_value:
+            row = box.row(align=True)
+            row.prop(modifier, "value_min")
+            row.prop(modifier, "value_max")
+
+    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()
+            self.draw_modifier_common(box, modifier)
+
+            if modifier.type == "ALONG_STROKE":
+                self.draw_modifier_color_ramp_common(box, modifier, False)
+
+            elif modifier.type == "DISTANCE_FROM_OBJECT":
+                box.prop(modifier, "target")
+                self.draw_modifier_color_ramp_common(box, modifier, True)
+
+            elif modifier.type == "DISTANCE_FROM_CAMERA":
+                self.draw_modifier_color_ramp_common(box, modifier, True)
+                prop = box.operator("scene.freestyle_fill_range_by_selection")
+                prop.type = 'COLOR'
+                prop.name = modifier.name
+
+            elif modifier.type == "MATERIAL":
+                row = box.row()
+                row.prop(modifier, "material_attr", text="")
+                sub = row.column()
+                sub.prop(modifier, "use_ramp")
+                if modifier.material_attr in ["DIFF", "SPEC"]:
+                    sub.enabled = True
+                    show_ramp = modifier.use_ramp
+                else:
+                    sub.enabled = False
+                    show_ramp = True
+                if show_ramp:
+                    self.draw_modifier_color_ramp_common(box, modifier, False)
+
+    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()
+            self.draw_modifier_common(box, modifier)
+
+            if modifier.type == "ALONG_STROKE":
+                self.draw_modifier_curve_common(box, modifier, False, False)
+
+            elif modifier.type == "DISTANCE_FROM_OBJECT":
+                box.prop(modifier, "target")
+                self.draw_modifier_curve_common(box, modifier, True, False)
+
+            elif modifier.type == "DISTANCE_FROM_CAMERA":
+                self.draw_modifier_curve_common(box, modifier, True, False)
+                prop = box.operator("scene.freestyle_fill_range_by_selection")
+                prop.type = 'ALPHA'
+                prop.name = modifier.name
+
+            elif modifier.type == "MATERIAL":
+                box.prop(modifier, "material_attr", text="")
+                self.draw_modifier_curve_common(box, modifier, False, False)
+
+    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()
+            self.draw_modifier_common(box, modifier)
+
+            if modifier.type == "ALONG_STROKE":
+                self.draw_modifier_curve_common(box, modifier, False, True)
+
+            elif modifier.type == "DISTANCE_FROM_OBJECT":
+                box.prop(modifier, "target")
+                self.draw_modifier_curve_common(box, modifier, True, True)
+
+            elif modifier.type == "DISTANCE_FROM_CAMERA":
+                self.draw_modifier_curve_common(box, modifier, True, True)
+                prop = box.operator("scene.freestyle_fill_range_by_selection")
+                prop.type = 'THICKNESS'
+                prop.name = modifier.name
+
+            elif modifier.type == "MATERIAL":
+                box.prop(modifier, "material_attr", text="")
+                self.draw_modifier_curve_common(box, modifier, False, True)
+
+    def draw(self, context):
+        layout = self.layout
+
+        rd = context.scene.render
+        rl = rd.layers.active
+        lineset = rl.freestyle_settings.linesets.active
+        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":
+            col.label(text="Chaining:")
+            col.prop(linestyle, "same_object")
+            col.separator()
+            col.label(text="Splitting:")
+            sub = col.row(align=True)
+            sub.prop(linestyle, "material_boundary")
+            col.separator()
+            col.label(text="Caps:")
+            sub = col.row(align=True)
+            sub.prop(linestyle, "caps", expand=True)
+            col.separator()
+            col.prop(linestyle, "use_dashed_line")
+            sub = col.row()
+            sub.enabled = linestyle.use_dashed_line
+            subsub = sub.column()
+            subsub.label(text="Dash")
+            subsub.prop(linestyle, "dash1", text="")
+            subsub = sub.column()
+            subsub.label(text="Gap")
+            subsub.prop(linestyle, "gap1", text="")
+            subsub = sub.column()
+            subsub.label(text="Dash")
+            subsub.prop(linestyle, "dash2", text="")
+            subsub = sub.column()
+            subsub.label(text="Gap")
+            subsub.prop(linestyle, "gap2", text="")
+            subsub = sub.column()
+            subsub.label(text="Dash")
+            subsub.prop(linestyle, "dash3", text="")
+            subsub = sub.column()
+            subsub.label(text="Gap")
+            subsub.prop(linestyle, "gap3", text="")
+        elif linestyle.panel == "DISTORT":
+            pass
+        elif linestyle.panel == "MISC":
+            pass
+
+
 class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
     bl_label = "Dimensions"
     COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -398,6 +737,11 @@ class RENDER_PT_post_processing(RenderButtonsPanel, 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, "use_freestyle", text="Freestyle")
 
 class RENDER_PT_stamp(RenderButtonsPanel, Panel):
     bl_label = "Stamp"