[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27623] branches/render25/source/blender: functions for adding curve points
Campbell Barton
ideasman42 at gmail.com
Sat Mar 20 17:25:34 CET 2010
Revision: 27623
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27623
Author: campbellbarton
Date: 2010-03-20 17:25:34 +0100 (Sat, 20 Mar 2010)
Log Message:
-----------
functions for adding curve points
eg.
curve.splines[0].points.add()
curve.splines[1].bezier_points.add(10)
Modified Paths:
--------------
branches/render25/source/blender/blenkernel/BKE_curve.h
branches/render25/source/blender/blenkernel/intern/curve.c
branches/render25/source/blender/makesrna/intern/rna_curve.c
Modified: branches/render25/source/blender/blenkernel/BKE_curve.h
===================================================================
--- branches/render25/source/blender/blenkernel/BKE_curve.h 2010-03-20 14:23:56 UTC (rev 27622)
+++ branches/render25/source/blender/blenkernel/BKE_curve.h 2010-03-20 16:25:34 UTC (rev 27623)
@@ -89,6 +89,9 @@
void switchdirectionNurb( struct Nurb *nu);
+void addNurbPoints(struct Nurb *nu, int number);
+void addNurbPointsBezier(struct Nurb *nu, int number);
+
float (*curve_getVertexCos(struct Curve *cu, struct ListBase *lb, int *numVerts_r))[3];
void curve_applyVertexCos(struct Curve *cu, struct ListBase *lb, float (*vertexCos)[3]);
Modified: branches/render25/source/blender/blenkernel/intern/curve.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/curve.c 2010-03-20 14:23:56 UTC (rev 27622)
+++ branches/render25/source/blender/blenkernel/intern/curve.c 2010-03-20 16:25:34 UTC (rev 27623)
@@ -519,9 +519,49 @@
bp++;
}
}
+}
+/* be sure to call makeknots after this */
+void addNurbPoints(Nurb *nu, int number)
+{
+ BPoint *tmp= nu->bp;
+ int i;
+ nu->bp= (BPoint *)MEM_mallocN((nu->pntsu + number) * sizeof(BPoint), "rna_Curve_spline_points_add");
+
+ if(tmp) {
+ memmove(nu->bp, tmp, nu->pntsu * sizeof(BPoint));
+ MEM_freeN(tmp);
+ }
+
+ memset(nu->bp + nu->pntsu, 0, number * sizeof(BPoint));
+
+ for(i=0, tmp= nu->bp + nu->pntsu; i < number; i++, tmp++) {
+ tmp->radius= 1.0f;
+ }
+
+ nu->pntsu += number;
}
+void addNurbPointsBezier(Nurb *nu, int number)
+{
+ BezTriple *tmp= nu->bezt;
+ int i;
+ nu->bezt= (BezTriple *)MEM_mallocN((nu->pntsu + number) * sizeof(BezTriple), "rna_Curve_spline_points_add");
+
+ if(tmp) {
+ memmove(nu->bezt, tmp, nu->pntsu * sizeof(BezTriple));
+ MEM_freeN(tmp);
+ }
+
+ memset(nu->bezt + nu->pntsu, 0, number * sizeof(BezTriple));
+
+ for(i=0, tmp= nu->bezt + nu->pntsu; i < number; i++, tmp++) {
+ tmp->radius= 1.0f;
+ }
+
+ nu->pntsu += number;
+}
+
/* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */
Modified: branches/render25/source/blender/makesrna/intern/rna_curve.c
===================================================================
--- branches/render25/source/blender/makesrna/intern/rna_curve.c 2010-03-20 14:23:56 UTC (rev 27622)
+++ branches/render25/source/blender/makesrna/intern/rna_curve.c 2010-03-20 16:25:34 UTC (rev 27623)
@@ -200,14 +200,17 @@
rna_iterator_array_begin(iter, (void*)nu->bp, sizeof(BPoint), nu->pntsv>0 ? nu->pntsu*nu->pntsv : nu->pntsu, 0, NULL);
}
-static void rna_Curve_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Curve_update_data_id(Main *bmain, Scene *scene, ID *id)
{
- ID *id= ptr->id.data;
-
DAG_id_flush_update(id, OB_RECALC_DATA);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
}
+static void rna_Curve_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ rna_Curve_update_data_id(bmain, scene, ptr->id.data);
+}
+
static void rna_Curve_update_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
{
DAG_scene_sort(scene);
@@ -308,6 +311,41 @@
rna_Curve_update_data(bmain, scene, ptr);
}
+static void rna_Curve_spline_points_add(ID *id, Nurb *nu, bContext *C, ReportList *reports, int number)
+{
+ if(nu->type == CU_BEZIER) {
+ BKE_report(reports, RPT_ERROR, "Bezier spline can't have points added");
+ }
+ else if(number==0) {
+ // do nothing
+ } else {
+
+ addNurbPoints(nu, number);
+
+ /* update */
+ makeknots(nu, 1);
+
+ rna_Curve_update_data_id(CTX_data_main(C), CTX_data_scene(C), id);
+ }
+}
+
+static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, bContext *C, ReportList *reports, int number)
+{
+ if(nu->type != CU_BEZIER) {
+ BKE_report(reports, RPT_ERROR, "Only bezier splines can be added");
+ }
+ else if(number==0) {
+ // do nothing
+ } else {
+ addNurbPointsBezier(nu, number);
+
+ /* update */
+ makeknots(nu, 1);
+
+ rna_Curve_update_data_id(CTX_data_main(C), CTX_data_scene(C), id);
+ }
+}
+
static Nurb *rna_Curve_spline_new(Curve *cu, int type)
{
Nurb *nu= ( Nurb * ) MEM_callocN( sizeof( Nurb ), "spline.new" );
@@ -796,7 +834,62 @@
}
-/* scene.objects */
+/* curve.splines[0].points */
+static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ //PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "SplinePoints");
+ srna= RNA_def_struct(brna, "SplinePoints", NULL);
+ RNA_def_struct_sdna(srna, "Nurb");
+ RNA_def_struct_ui_text(srna, "Spline Points", "Collection of spline points");
+
+ func= RNA_def_function(srna, "add", "rna_Curve_spline_points_add");
+ RNA_def_function_ui_description(func, "Add a number of points to this spline.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
+ parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+
+ /*
+ func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
+ RNA_def_function_ui_description(func, "Remove a spline from a curve.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ */
+}
+
+static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ //PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "SplineBezierPoints");
+ srna= RNA_def_struct(brna, "SplineBezierPoints", NULL);
+ RNA_def_struct_sdna(srna, "Nurb");
+ RNA_def_struct_ui_text(srna, "Spline Bezier Points", "Collection of spline bezirt points");
+
+ func= RNA_def_function(srna, "add", "rna_Curve_spline_bezpoints_add");
+ RNA_def_function_ui_description(func, "Add a number of points to this spline.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
+ parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+
+ /*
+ func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
+ RNA_def_function_ui_description(func, "Remove a spline from a curve.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ */
+}
+
+/* curve.splines */
static void rna_def_curve_splines(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
@@ -1011,11 +1104,13 @@
RNA_def_property_struct_type(prop, "SplinePoint");
RNA_def_property_collection_funcs(prop, "rna_BPoint_array_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_Nurb_length", 0, 0);
RNA_def_property_ui_text(prop, "Points", "Collection of points that make up this poly or nurbs spline");
+ rna_def_curve_spline_points(brna, prop);
prop= RNA_def_property(srna, "bezier_points", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "BezierSplinePoint");
RNA_def_property_collection_sdna(prop, NULL, "bezt", "pntsu");
RNA_def_property_ui_text(prop, "Bezier Points", "Collection of points for bezier curves only");
+ rna_def_curve_spline_bezpoints(brna, prop);
prop= RNA_def_property(srna, "tilt_interpolation", PROP_ENUM, PROP_NONE);
More information about the Bf-blender-cvs
mailing list