Revision: 46674
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46674
Author:   blendix
Date:     2012-05-15 18:34:00 +0000 (Tue, 15 May 2012)
Log Message:
-----------
Python/CurveMapping: add Curve Mapping functions to add/remove curve points,
evaluate the curve and update after changes.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_colortools.h
    trunk/blender/source/blender/blenkernel/intern/colortools.c
    trunk/blender/source/blender/makesrna/intern/rna_color.c

Modified: trunk/blender/source/blender/blenkernel/BKE_colortools.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_colortools.h    2012-05-15 
16:32:08 UTC (rev 46673)
+++ trunk/blender/source/blender/blenkernel/BKE_colortools.h    2012-05-15 
18:34:00 UTC (rev 46674)
@@ -33,6 +33,7 @@
 
 struct CurveMapping;
 struct CurveMap;
+struct CurveMapPoint;
 struct Scopes;
 struct ImBuf;
 struct rctf;
@@ -52,12 +53,14 @@
 
 #define CURVEMAP_SLOPE_NEGATIVE 0
 #define CURVEMAP_SLOPE_POSITIVE 1
-void                curvemap_reset(struct CurveMap *cuma, struct rctf *clipr, 
int preset, int slope);
-void                curvemap_remove(struct CurveMap *cuma, int flag);
-void                curvemap_insert(struct CurveMap *cuma, float x, float y);
-void                curvemap_sethandle(struct CurveMap *cuma, int type);
+void                    curvemap_reset(struct CurveMap *cuma, struct rctf 
*clipr, int preset, int slope);
+void                    curvemap_remove(struct CurveMap *cuma, int flag);
+void                    curvemap_remove_point(struct CurveMap *cuma, struct 
CurveMapPoint *cmp);
+struct CurveMapPoint    *curvemap_insert(struct CurveMap *cuma, float x, float 
y);
+void                    curvemap_sethandle(struct CurveMap *cuma, int type);
 
 void                curvemapping_changed(struct CurveMapping *cumap, int 
rem_doubles);
+void                curvemapping_changed_all(struct CurveMapping *cumap);
 
 /* single curve, no table check */
 float               curvemap_evaluateF(struct CurveMap *cuma, float value);

Modified: trunk/blender/source/blender/blenkernel/intern/colortools.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/colortools.c 2012-05-15 
16:32:08 UTC (rev 46673)
+++ trunk/blender/source/blender/blenkernel/intern/colortools.c 2012-05-15 
18:34:00 UTC (rev 46674)
@@ -146,6 +146,32 @@
 /* ***************** operations on single curve ************* */
 /* ********** NOTE: requires curvemapping_changed() call after ******** */
 
+/* remove specified point */
+void curvemap_remove_point(CurveMap *cuma, CurveMapPoint *point)
+{
+       CurveMapPoint *cmp;
+       int a, b, removed = 0;
+       
+       /* must have 2 points minimum */
+       if (cuma->totpoint <= 2)
+               return;
+
+       cmp = MEM_mallocN((cuma->totpoint) * sizeof(CurveMapPoint), "curve 
points");
+
+       /* well, lets keep the two outer points! */
+       for (a = 0, b = 0; a < cuma->totpoint; a++) {
+               if (&cuma->curve[a] != point) {
+                       cmp[b] = cuma->curve[a];
+                       b++;
+               }
+               else removed++;
+       }
+       
+       MEM_freeN(cuma->curve);
+       cuma->curve = cmp;
+       cuma->totpoint -= removed;
+}
+
 /* removes with flag set */
 void curvemap_remove(CurveMap *cuma, int flag)
 {
@@ -168,9 +194,10 @@
        cuma->totpoint -= removed;
 }
 
-void curvemap_insert(CurveMap *cuma, float x, float y)
+CurveMapPoint *curvemap_insert(CurveMap *cuma, float x, float y)
 {
        CurveMapPoint *cmp = MEM_callocN((cuma->totpoint + 1) * 
sizeof(CurveMapPoint), "curve points");
+       CurveMapPoint *newcmp = NULL;
        int a, b, foundloc = 0;
                
        /* insert fragments of the old one and the new point to the new curve */
@@ -181,6 +208,7 @@
                        cmp[a].y = y;
                        cmp[a].flag = CUMA_SELECT;
                        foundloc = 1;
+                       newcmp = &cmp[a];
                }
                else {
                        cmp[a].x = cuma->curve[b].x;
@@ -195,6 +223,8 @@
        /* free old curve and replace it with new one */
        MEM_freeN(cuma->curve);
        cuma->curve = cmp;
+
+       return newcmp;
 }
 
 void curvemap_reset(CurveMap *cuma, rctf *clipr, int preset, int slope)
@@ -670,6 +700,20 @@
        curvemap_make_table(cuma, clipr);
 }
 
+void curvemapping_changed_all(CurveMapping *cumap)
+{
+       int a, cur = cumap->cur;
+
+       for (a = 0; a < CM_TOT; a++) {
+               if (cumap->cm[a].curve) {
+                       cumap->cur = a;
+                       curvemapping_changed(cumap, 0);
+               }
+       }
+
+       cumap->cur = cur;
+}
+
 /* table should be verified */
 float curvemap_evaluateF(CurveMap *cuma, float value)
 {

Modified: trunk/blender/source/blender/makesrna/intern/rna_color.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_color.c    2012-05-15 
16:32:08 UTC (rev 46673)
+++ trunk/blender/source/blender/makesrna/intern/rna_color.c    2012-05-15 
18:34:00 UTC (rev 46674)
@@ -320,18 +320,14 @@
        srna = RNA_def_struct(brna, "CurveMapPoint", NULL);
        RNA_def_struct_ui_text(srna, "CurveMapPoint", "Point of a curve used 
for a curve mapping");
 
-       /* not editable for now, need to have CurveMapping to do 
curvemapping_changed */
-
        prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "x");
        RNA_def_property_array(prop, 2);
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Location", "X/Y coordinates of the 
curve point");
 
        prop = RNA_def_property(srna, "handle_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
        RNA_def_property_enum_items(prop, prop_handle_type_items);
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Handle Type", "Curve interpolation at 
this point: Bezier or vector");
 
        prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
@@ -339,10 +335,38 @@
        RNA_def_property_ui_text(prop, "Select", "Selection state of the curve 
point");
 }
 
+static void rna_def_curvemap_points_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+       StructRNA *srna;
+       PropertyRNA *parm;
+       FunctionRNA *func;
+
+       RNA_def_property_srna(cprop, "CurveMapPoints");
+       srna = RNA_def_struct(brna, "CurveMapPoints", NULL);
+       RNA_def_struct_sdna(srna, "CurveMap");
+       RNA_def_struct_ui_text(srna, "Curve Map Point", "Collection of Curve 
Map Points");
+
+       func = RNA_def_function(srna, "new", "curvemap_insert");
+       RNA_def_function_ui_description(func, "Add point to CurveMap");
+       parm = RNA_def_float(func, "position", 0.0f, -FLT_MAX, FLT_MAX, 
"Position", "Position to add point", -FLT_MAX, FLT_MAX);
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm = RNA_def_float(func, "value", 0.0f, -FLT_MAX, FLT_MAX, "Value", 
"Value of point", -FLT_MAX, FLT_MAX);
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm = RNA_def_pointer(func, "point", "CurveMapPoint", "", "New point");
+       RNA_def_function_return(func, parm);
+
+       func = RNA_def_function(srna, "remove", "curvemap_remove_point");
+       RNA_def_function_ui_description(func, "Delete point from CurveMap");
+       parm = RNA_def_pointer(func, "point", "CurveMapPoint", "", 
"PointElement to remove");
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+}
+
 static void rna_def_curvemap(BlenderRNA *brna)
 {
        StructRNA *srna;
-       PropertyRNA *prop;
+       PropertyRNA *prop, *parm;
+       FunctionRNA *func;
+
        static EnumPropertyItem prop_extend_items[] = {
                {0, "HORIZONTAL", 0, "Horizontal", ""},
                {CUMA_EXTEND_EXTRAPOLATE, "EXTRAPOLATED", 0, "Extrapolated", 
""},
@@ -352,24 +376,30 @@
        srna = RNA_def_struct(brna, "CurveMap", NULL);
        RNA_def_struct_ui_text(srna, "CurveMap", "Curve in a curve mapping");
 
-       /* not editable for now, need to have CurveMapping to do 
curvemapping_changed */
-
        prop = RNA_def_property(srna, "extend", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
        RNA_def_property_enum_items(prop, prop_extend_items);
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Extend", "Extrapolate the curve or 
extend it horizontally");
 
        prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "curve", "totpoint");
        RNA_def_property_struct_type(prop, "CurveMapPoint");
        RNA_def_property_ui_text(prop, "Points", "");
+       rna_def_curvemap_points_api(brna, prop);
+
+       func = RNA_def_function(srna, "evaluate", "curvemap_evaluateF");
+       RNA_def_function_ui_description(func, "Evaluate curve at given 
location");
+       parm = RNA_def_float(func, "position", 0.0f, -FLT_MAX, FLT_MAX, 
"Position", "Position to evaluate curve at", -FLT_MAX, FLT_MAX);
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm = RNA_def_float(func, "value", 0.0f, -FLT_MAX, FLT_MAX, "Value", 
"Value of curve at given location", -FLT_MAX, FLT_MAX);
+       RNA_def_function_return(func, parm);
 }
 
 static void rna_def_curvemapping(BlenderRNA *brna)
 {
        StructRNA *srna;
        PropertyRNA *prop;
+       FunctionRNA *func;
 
        srna = RNA_def_struct(brna, "CurveMapping", NULL);
        RNA_def_struct_ui_text(srna, "CurveMapping",
@@ -423,6 +453,9 @@
        RNA_def_property_range(prop, -1000.0f, 1000.0f);
        RNA_def_property_ui_text(prop, "White Level", "For RGB curves, the 
color that white is mapped to");
        RNA_def_property_float_funcs(prop, NULL, 
"rna_CurveMapping_white_level_set", NULL);
+
+       func = RNA_def_function(srna, "update", "curvemapping_changed_all");
+       RNA_def_function_ui_description(func, "Update curve mapping after 
making changes");
 }
 
 static void rna_def_color_ramp_element(BlenderRNA *brna)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to