[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38667] branches/soc-2008-mxcurioni: New line style modifiers for changing line color, alpha transparency, and

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Mon Jul 25 01:29:20 CEST 2011


Revision: 38667
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38667
Author:   kjym3
Date:     2011-07-24 23:29:19 +0000 (Sun, 24 Jul 2011)
Log Message:
-----------
New line style modifiers for changing line color, alpha transparency, and
line thickness based on object materials.  Accessible material attributes
are diffuse color, specular color, specular hardness, and alpha.

Modified Paths:
--------------
    branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py
    branches/soc-2008-mxcurioni/release/scripts/startup/bl_ui/properties_render.py
    branches/soc-2008-mxcurioni/source/blender/blenkernel/intern/linestyle.c
    branches/soc-2008-mxcurioni/source/blender/blenloader/intern/readfile.c
    branches/soc-2008-mxcurioni/source/blender/blenloader/intern/writefile.c
    branches/soc-2008-mxcurioni/source/blender/makesdna/DNA_linestyle_types.h
    branches/soc-2008-mxcurioni/source/blender/makesrna/RNA_access.h
    branches/soc-2008-mxcurioni/source/blender/makesrna/intern/rna_linestyle.c

Modified: branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py
===================================================================
--- branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py	2011-07-24 20:27:27 UTC (rev 38666)
+++ branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py	2011-07-24 23:29:19 UTC (rev 38667)
@@ -278,6 +278,115 @@
             c = self.blend_curve(a, b)
             attr.setThickness(c/2, c/2)
 
+# Material modifiers
+
+def iter_material_color(stroke, material_attr):
+    func = MaterialF0D()
+    it = stroke.strokeVerticesBegin()
+    while not it.isEnd():
+        material = func(it.castToInterface0DIterator())
+        if material_attr == "DIFF":
+            color = (material.diffuseR(),
+                     material.diffuseG(),
+                     material.diffuseB())
+        elif material_attr == "SPEC":
+            color = (material.specularR(),
+                     material.specularG(),
+                     material.specularB())
+        else:
+            raise ValueError("unexpected material attribute: " + material_attr)
+        yield it, color
+        it.increment()
+
+def iter_material_value(stroke, material_attr):
+    func = MaterialF0D()
+    it = stroke.strokeVerticesBegin()
+    while not it.isEnd():
+        material = func(it.castToInterface0DIterator())
+        if material_attr == "DIFF":
+            r = material.diffuseR()
+            g = material.diffuseG()
+            b = material.diffuseB()
+            t = 0.35 * r + 0.45 * r + 0.2 * b
+        elif material_attr == "DIFF_R":
+            t = material.diffuseR()
+        elif material_attr == "DIFF_G":
+            t = material.diffuseG()
+        elif material_attr == "DIFF_B":
+            t = material.diffuseB()
+        elif material_attr == "SPEC":
+            r = material.specularR()
+            g = material.specularG()
+            b = material.specularB()
+            t = 0.35 * r + 0.45 * r + 0.2 * b
+        elif material_attr == "SPEC_R":
+            t = material.specularR()
+        elif material_attr == "SPEC_G":
+            t = material.specularG()
+        elif material_attr == "SPEC_B":
+            t = material.specularB()
+        elif material_attr == "SPEC_HARDNESS":
+            t = material.shininess()
+        elif material_attr == "ALPHA":
+            t = material.diffuseA()
+        else:
+            raise ValueError("unexpected material attribute: " + material_attr)
+        yield it, t
+        it.increment()
+
+class ColorMaterialShader(ColorRampModifier):
+    def __init__(self, blend, influence, ramp, material_attr, use_ramp):
+        ColorRampModifier.__init__(self, blend, influence, ramp)
+        self.__material_attr = material_attr
+        self.__use_ramp = use_ramp
+    def getName(self):
+        return "ColorMaterialShader"
+    def shade(self, stroke):
+        if self.__material_attr in ["DIFF", "SPEC"] and not self.__use_ramp:
+            for it, b in iter_material_color(stroke, self.__material_attr):
+                attr = it.getObject().attribute()
+                a = attr.getColorRGB()
+                c = self.blend_ramp(a, b)
+                attr.setColor(c)
+        else:
+            for it, t in iter_material_value(stroke, self.__material_attr):
+                attr = it.getObject().attribute()
+                a = attr.getColorRGB()
+                b = self.evaluate(t)
+                c = self.blend_ramp(a, b)
+                attr.setColor(c)
+
+class AlphaMaterialShader(CurveMappingModifier):
+    def __init__(self, blend, influence, mapping, invert, curve, material_attr):
+        CurveMappingModifier.__init__(self, blend, influence, mapping, invert, curve)
+        self.__material_attr = material_attr
+    def getName(self):
+        return "AlphaMaterialShader"
+    def shade(self, stroke):
+        for it, t in iter_material_value(stroke, self.__material_attr):
+            attr = it.getObject().attribute()
+            a = attr.getAlpha()
+            b = self.evaluate(t)
+            c = self.blend_curve(a, b)
+            attr.setAlpha(c)
+
+class ThicknessMaterialShader(CurveMappingModifier):
+    def __init__(self, blend, influence, mapping, invert, curve, material_attr, value_min, value_max):
+        CurveMappingModifier.__init__(self, blend, influence, mapping, invert, curve)
+        self.__material_attr = material_attr
+        self.__value_min = value_min
+        self.__value_max = value_max
+    def getName(self):
+        return "ThicknessMaterialShader"
+    def shade(self, stroke):
+        for it, t in iter_material_value(stroke, self.__material_attr):
+            attr = it.getObject().attribute()
+            a = attr.getThicknessRL()
+            a = a[0] + a[1]
+            b = self.__value_min + self.evaluate(t) * (self.__value_max - self.__value_min)
+            c = self.blend_curve(a, b)
+            attr.setThickness(c/2, c/2)
+
 # Predicates and helper functions
 
 class QuantitativeInvisibilityRangeUP1D(UnaryPredicate1D):
@@ -660,6 +769,10 @@
             shaders_list.append(ColorDistanceFromObjectShader(
                 m.blend, m.influence, m.color_ramp, m.target,
                 m.range_min, m.range_max))
+        elif m.type == "MATERIAL":
+            shaders_list.append(ColorMaterialShader(
+                m.blend, m.influence, m.color_ramp, m.material_attr,
+                m.use_ramp))
     for m in linestyle.alpha_modifiers:
         if not m.use:
             continue
@@ -674,6 +787,10 @@
             shaders_list.append(AlphaDistanceFromObjectShader(
                 m.blend, m.influence, m.mapping, m.invert, m.curve, m.target,
                 m.range_min, m.range_max))
+        elif m.type == "MATERIAL":
+            shaders_list.append(AlphaMaterialShader(
+                m.blend, m.influence, m.mapping, m.invert, m.curve,
+                m.material_attr))
     for m in linestyle.thickness_modifiers:
         if not m.use:
             continue
@@ -689,6 +806,10 @@
             shaders_list.append(ThicknessDistanceFromObjectShader(
                 m.blend, m.influence, m.mapping, m.invert, m.curve, m.target,
                 m.range_min, m.range_max, m.value_min, m.value_max))
+        elif m.type == "MATERIAL":
+            shaders_list.append(ThicknessMaterialShader(
+                m.blend, m.influence, m.mapping, m.invert, m.curve,
+                m.material_attr, m.value_min, m.value_max))
     if linestyle.caps == "ROUND":
         shaders_list.append(RoundCapShader())
     elif linestyle.caps == "SQUARE":

Modified: branches/soc-2008-mxcurioni/release/scripts/startup/bl_ui/properties_render.py
===================================================================
--- branches/soc-2008-mxcurioni/release/scripts/startup/bl_ui/properties_render.py	2011-07-24 20:27:27 UTC (rev 38666)
+++ branches/soc-2008-mxcurioni/release/scripts/startup/bl_ui/properties_render.py	2011-07-24 23:29:19 UTC (rev 38667)
@@ -319,6 +319,35 @@
         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
 
@@ -326,17 +355,32 @@
         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":
+            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")
-            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")
+                self.draw_modifier_color_ramp_common(box, modifier, True)
 
+            elif modifier.type == "DISTANCE_FROM_CAMERA":
+                self.draw_modifier_color_ramp_common(box, modifier, True)
+
+            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
 
@@ -344,23 +388,22 @@
         self.draw_modifier_box_header(col.box(), modifier)
         if modifier.expanded:
             box = col.box()
-            row = box.row()
-            row.prop(modifier, "blend", text="")

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list