Cleanup: reorder report argument for pointer assignment
[blender.git] / source / blender / makesrna / intern / rna_curve.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup RNA
19  */
20
21 #include <stdlib.h>
22
23 #include "DNA_curve_types.h"
24 #include "DNA_key_types.h"
25 #include "DNA_material_types.h"
26 #include "DNA_scene_types.h"
27
28 #include "BLI_utildefines.h"
29 #include "BLI_math.h"
30
31 #include "BLT_translation.h"
32
33 #include "BKE_font.h"
34
35 #include "RNA_access.h"
36 #include "RNA_define.h"
37 #include "RNA_enum_types.h"
38
39 #include "rna_internal.h"
40
41 #include "WM_types.h"
42
43 #ifndef RNA_RUNTIME
44 static const EnumPropertyItem beztriple_handle_type_items[] = {
45     {HD_FREE, "FREE", 0, "Free", ""},
46     {HD_VECT, "VECTOR", 0, "Vector", ""},
47     {HD_ALIGN, "ALIGNED", 0, "Aligned", ""},
48     {HD_AUTO, "AUTO", 0, "Auto", ""},
49     {0, NULL, 0, NULL, NULL},
50 };
51 #endif
52
53 const EnumPropertyItem rna_enum_keyframe_handle_type_items[] = {
54     {HD_FREE,
55      "FREE",
56      ICON_HANDLETYPE_FREE_VEC,
57      "Free",
58      "Completely independent manually set handle"},
59     {HD_ALIGN,
60      "ALIGNED",
61      ICON_HANDLETYPE_ALIGNED_VEC,
62      "Aligned",
63      "Manually set handle with rotation locked together with its pair"},
64     {HD_VECT,
65      "VECTOR",
66      ICON_HANDLETYPE_VECTOR_VEC,
67      "Vector",
68      "Automatic handles that create straight lines"},
69     {HD_AUTO,
70      "AUTO",
71      ICON_HANDLETYPE_AUTO_VEC,
72      "Automatic",
73      "Automatic handles that create smooth curves"},
74     {HD_AUTO_ANIM,
75      "AUTO_CLAMPED",
76      ICON_HANDLETYPE_AUTO_CLAMP_VEC,
77      "Auto Clamped",
78      "Automatic handles that create smooth curves which only change direction at keyframes"},
79     {0, NULL, 0, NULL, NULL},
80 };
81
82 const EnumPropertyItem rna_enum_beztriple_interpolation_mode_items[] = {
83     /* interpolation */
84     {0, "", 0, N_("Interpolation"), "Standard transitions between keyframes"},
85     {BEZT_IPO_CONST,
86      "CONSTANT",
87      ICON_IPO_CONSTANT,
88      "Constant",
89      "No interpolation, value of A gets held until B is encountered"},
90     {BEZT_IPO_LIN,
91      "LINEAR",
92      ICON_IPO_LINEAR,
93      "Linear",
94      "Straight-line interpolation between A and B (i.e. no ease in/out)"},
95     {BEZT_IPO_BEZ,
96      "BEZIER",
97      ICON_IPO_BEZIER,
98      "Bezier",
99      "Smooth interpolation between A and B, with some control over curve shape"},
100
101     /* easing */
102     {0,
103      "",
104      0,
105      N_("Easing (by strength)"),
106      "Predefined inertial transitions, useful for motion graphics (from least to most "
107      "''dramatic'')"},
108     {BEZT_IPO_SINE,
109      "SINE",
110      ICON_IPO_SINE,
111      "Sinusoidal",
112      "Sinusoidal easing (weakest, almost linear but with a slight curvature)"},
113     {BEZT_IPO_QUAD, "QUAD", ICON_IPO_QUAD, "Quadratic", "Quadratic easing"},
114     {BEZT_IPO_CUBIC, "CUBIC", ICON_IPO_CUBIC, "Cubic", "Cubic easing"},
115     {BEZT_IPO_QUART, "QUART", ICON_IPO_QUART, "Quartic", "Quartic easing"},
116     {BEZT_IPO_QUINT, "QUINT", ICON_IPO_QUINT, "Quintic", "Quintic easing"},
117     {BEZT_IPO_EXPO, "EXPO", ICON_IPO_EXPO, "Exponential", "Exponential easing (dramatic)"},
118     {BEZT_IPO_CIRC,
119      "CIRC",
120      ICON_IPO_CIRC,
121      "Circular",
122      "Circular easing (strongest and most dynamic)"},
123
124     {0, "", 0, N_("Dynamic Effects"), "Simple physics-inspired easing effects"},
125     {BEZT_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"},
126     {BEZT_IPO_BOUNCE,
127      "BOUNCE",
128      ICON_IPO_BOUNCE,
129      "Bounce",
130      "Exponentially decaying parabolic bounce, like when objects collide"},
131     {BEZT_IPO_ELASTIC,
132      "ELASTIC",
133      ICON_IPO_ELASTIC,
134      "Elastic",
135      "Exponentially decaying sine wave, like an elastic band"},
136
137     {0, NULL, 0, NULL, NULL},
138 };
139
140 #ifndef RNA_RUNTIME
141 static const EnumPropertyItem curve_type_items[] = {
142     {CU_POLY, "POLY", 0, "Poly", ""},
143     {CU_BEZIER, "BEZIER", 0, "Bezier", ""},
144     {CU_BSPLINE, "BSPLINE", 0, "BSpline", ""},
145     {CU_CARDINAL, "CARDINAL", 0, "Cardinal", ""},
146     {CU_NURBS, "NURBS", 0, "Ease", ""},
147     {0, NULL, 0, NULL, NULL},
148 };
149 #endif
150
151 static const EnumPropertyItem curve3d_fill_mode_items[] = {
152     {0, "FULL", 0, "Full", ""},
153     {CU_BACK, "BACK", 0, "Back", ""},
154     {CU_FRONT, "FRONT", 0, "Front", ""},
155     {CU_FRONT | CU_BACK, "HALF", 0, "Half", ""},
156     {0, NULL, 0, NULL, NULL},
157 };
158
159 #ifdef RNA_RUNTIME
160 static const EnumPropertyItem curve2d_fill_mode_items[] = {
161     {0, "NONE", 0, "None", ""},
162     {CU_BACK, "BACK", 0, "Back", ""},
163     {CU_FRONT, "FRONT", 0, "Front", ""},
164     {CU_FRONT | CU_BACK, "BOTH", 0, "Both", ""},
165     {0, NULL, 0, NULL, NULL},
166 };
167 #endif
168
169 #ifdef RNA_RUNTIME
170
171 #  include "DNA_object_types.h"
172
173 #  include "BKE_curve.h"
174 #  include "BKE_main.h"
175
176 #  include "DEG_depsgraph.h"
177 #  include "DEG_depsgraph_build.h"
178
179 #  include "WM_api.h"
180
181 #  include "MEM_guardedalloc.h"
182
183 #  include "ED_curve.h" /* for BKE_curve_nurbs_get */
184
185 /* highly irritating but from RNA we cant know this */
186 static Nurb *curve_nurb_from_point(Curve *cu, const void *point, int *nu_index, int *pt_index)
187 {
188   ListBase *nurbs = BKE_curve_nurbs_get(cu);
189   Nurb *nu;
190   int i = 0;
191
192   for (nu = nurbs->first; nu; nu = nu->next, i++) {
193     if (nu->type == CU_BEZIER) {
194       if (point >= (void *)nu->bezt && point < (void *)(nu->bezt + nu->pntsu)) {
195         break;
196       }
197     }
198     else {
199       if (point >= (void *)nu->bp && point < (void *)(nu->bp + (nu->pntsu * nu->pntsv))) {
200         break;
201       }
202     }
203   }
204
205   if (nu) {
206     if (nu_index) {
207       *nu_index = i;
208     }
209
210     if (pt_index) {
211       if (nu->type == CU_BEZIER)
212         *pt_index = (int)((BezTriple *)point - nu->bezt);
213       else
214         *pt_index = (int)((BPoint *)point - nu->bp);
215     }
216   }
217
218   return nu;
219 }
220
221 static StructRNA *rna_Curve_refine(PointerRNA *ptr)
222 {
223   Curve *cu = (Curve *)ptr->data;
224   short obtype = BKE_curve_type_get(cu);
225
226   if (obtype == OB_FONT)
227     return &RNA_TextCurve;
228   else if (obtype == OB_SURF)
229     return &RNA_SurfaceCurve;
230   else
231     return &RNA_Curve;
232 }
233
234 static void rna_BezTriple_handle1_get(PointerRNA *ptr, float *values)
235 {
236   BezTriple *bezt = (BezTriple *)ptr->data;
237   copy_v3_v3(values, bezt->vec[0]);
238 }
239
240 static void rna_BezTriple_handle1_set(PointerRNA *ptr, const float *values)
241 {
242   BezTriple *bezt = (BezTriple *)ptr->data;
243   copy_v3_v3(bezt->vec[0], values);
244 }
245
246 static void rna_BezTriple_handle2_get(PointerRNA *ptr, float *values)
247 {
248   BezTriple *bezt = (BezTriple *)ptr->data;
249   copy_v3_v3(values, bezt->vec[2]);
250 }
251
252 static void rna_BezTriple_handle2_set(PointerRNA *ptr, const float *values)
253 {
254   BezTriple *bezt = (BezTriple *)ptr->data;
255   copy_v3_v3(bezt->vec[2], values);
256 }
257
258 static void rna_BezTriple_ctrlpoint_get(PointerRNA *ptr, float *values)
259 {
260   BezTriple *bezt = (BezTriple *)ptr->data;
261   copy_v3_v3(values, bezt->vec[1]);
262 }
263
264 static void rna_BezTriple_ctrlpoint_set(PointerRNA *ptr, const float *values)
265 {
266   BezTriple *bezt = (BezTriple *)ptr->data;
267   copy_v3_v3(bezt->vec[1], values);
268 }
269
270 static void rna_Curve_texspace_set(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
271 {
272   Curve *cu = (Curve *)ptr->data;
273
274   if (cu->texflag & CU_AUTOSPACE)
275     BKE_curve_texspace_calc(cu);
276 }
277
278 static int rna_Curve_texspace_editable(PointerRNA *ptr, const char **UNUSED(r_info))
279 {
280   Curve *cu = (Curve *)ptr->data;
281   return (cu->texflag & CU_AUTOSPACE) ? 0 : PROP_EDITABLE;
282 }
283
284 static void rna_Curve_texspace_loc_get(PointerRNA *ptr, float *values)
285 {
286   Curve *cu = (Curve *)ptr->data;
287
288   if (!cu->bb)
289     BKE_curve_texspace_calc(cu);
290
291   copy_v3_v3(values, cu->loc);
292 }
293
294 static void rna_Curve_texspace_loc_set(PointerRNA *ptr, const float *values)
295 {
296   Curve *cu = (Curve *)ptr->data;
297
298   copy_v3_v3(cu->loc, values);
299 }
300
301 static void rna_Curve_texspace_size_get(PointerRNA *ptr, float *values)
302 {
303   Curve *cu = (Curve *)ptr->data;
304
305   if (!cu->bb)
306     BKE_curve_texspace_calc(cu);
307
308   copy_v3_v3(values, cu->size);
309 }
310
311 static void rna_Curve_texspace_size_set(PointerRNA *ptr, const float *values)
312 {
313   Curve *cu = (Curve *)ptr->data;
314
315   copy_v3_v3(cu->size, values);
316 }
317
318 static void rna_Curve_material_index_range(
319     PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax))
320 {
321   Curve *cu = (Curve *)ptr->id.data;
322   *min = 0;
323   *max = max_ii(0, cu->totcol - 1);
324 }
325
326 /* simply offset by don't expose -1 */
327 static int rna_ChariInfo_material_index_get(PointerRNA *ptr)
328 {
329   CharInfo *info = ptr->data;
330   return info->mat_nr ? info->mat_nr - 1 : 0;
331 }
332
333 static void rna_ChariInfo_material_index_set(PointerRNA *ptr, int value)
334 {
335   CharInfo *info = ptr->data;
336   info->mat_nr = value + 1;
337 }
338
339 static void rna_Curve_active_textbox_index_range(
340     PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax))
341 {
342   Curve *cu = (Curve *)ptr->id.data;
343   *min = 0;
344   *max = max_ii(0, cu->totbox - 1);
345 }
346
347 static void rna_Curve_dimension_set(PointerRNA *ptr, int value)
348 {
349   Curve *cu = (Curve *)ptr->id.data;
350   if (value == CU_3D)
351     cu->flag |= CU_3D;
352   else
353     cu->flag &= ~CU_3D;
354
355   BKE_curve_curve_dimension_update(cu);
356 }
357
358 static const EnumPropertyItem *rna_Curve_fill_mode_itemf(bContext *UNUSED(C),
359                                                          PointerRNA *ptr,
360                                                          PropertyRNA *UNUSED(prop),
361                                                          bool *UNUSED(r_free))
362 {
363   Curve *cu = (Curve *)ptr->id.data;
364
365   /* cast to quiet warning it IS a const still */
366   return (EnumPropertyItem *)((cu->flag & CU_3D) ? curve3d_fill_mode_items :
367                                                    curve2d_fill_mode_items);
368 }
369
370 static int rna_Nurb_length(PointerRNA *ptr)
371 {
372   Nurb *nu = (Nurb *)ptr->data;
373   if (nu->type == CU_BEZIER)
374     return 0;
375   return nu->pntsv > 0 ? nu->pntsu * nu->pntsv : nu->pntsu;
376 }
377
378 static void rna_Nurb_type_set(PointerRNA *ptr, int value)
379 {
380   Curve *cu = (Curve *)ptr->id.data;
381   Nurb *nu = (Nurb *)ptr->data;
382   const int pntsu_prev = nu->pntsu;
383
384   if (BKE_nurb_type_convert(nu, value, true)) {
385     if (nu->pntsu != pntsu_prev) {
386       cu->actvert = CU_ACT_NONE;
387     }
388   }
389 }
390
391 static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
392 {
393   Nurb *nu = (Nurb *)ptr->data;
394   rna_iterator_array_begin(iter,
395                            (void *)nu->bp,
396                            sizeof(BPoint),
397                            nu->pntsv > 0 ? nu->pntsu * nu->pntsv : nu->pntsu,
398                            0,
399                            NULL);
400 }
401
402 static void rna_Curve_update_data_id(Main *UNUSED(bmain), Scene *UNUSED(scene), ID *id)
403 {
404   DEG_id_tag_update(id, 0);
405   WM_main_add_notifier(NC_GEOM | ND_DATA, id);
406 }
407
408 static void rna_Curve_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
409 {
410   rna_Curve_update_data_id(bmain, scene, ptr->id.data);
411 }
412
413 static void rna_Curve_update_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
414 {
415   DEG_relations_tag_update(bmain);
416   rna_Curve_update_data(bmain, scene, ptr);
417 }
418
419 static void rna_Curve_update_points(Main *bmain, Scene *scene, PointerRNA *ptr)
420 {
421   Curve *cu = (Curve *)ptr->id.data;
422   Nurb *nu = curve_nurb_from_point(cu, ptr->data, NULL, NULL);
423
424   if (nu)
425     BKE_nurb_handles_calc(nu);
426
427   rna_Curve_update_data(bmain, scene, ptr);
428 }
429
430 static PointerRNA rna_Curve_bevelObject_get(PointerRNA *ptr)
431 {
432   Curve *cu = (Curve *)ptr->id.data;
433   Object *ob = cu->bevobj;
434
435   if (ob)
436     return rna_pointer_inherit_refine(ptr, &RNA_Object, ob);
437
438   return rna_pointer_inherit_refine(ptr, NULL, NULL);
439 }
440
441 static void rna_Curve_bevelObject_set(PointerRNA *ptr,
442                                       PointerRNA value,
443                                       struct ReportList *UNUSED(reports))
444 {
445   Curve *cu = (Curve *)ptr->id.data;
446   Object *ob = (Object *)value.data;
447
448   if (ob) {
449     /* if bevel object has got the save curve, as object, for which it's */
450     /* set as bevobj, there could be infinity loop in displist calculation */
451     if (ob->type == OB_CURVE && ob->data != cu) {
452       cu->bevobj = ob;
453       id_lib_extern((ID *)ob);
454     }
455   }
456   else {
457     cu->bevobj = NULL;
458   }
459 }
460
461 static bool rna_Curve_otherObject_poll(PointerRNA *ptr, PointerRNA value)
462 {
463   Curve *cu = (Curve *)ptr->id.data;
464   Object *ob = (Object *)value.data;
465
466   if (ob) {
467     if (ob->type == OB_CURVE && ob->data != cu) {
468       return 1;
469     }
470   }
471
472   return 0;
473 }
474
475 static PointerRNA rna_Curve_taperObject_get(PointerRNA *ptr)
476 {
477   Curve *cu = (Curve *)ptr->id.data;
478   Object *ob = cu->taperobj;
479
480   if (ob)
481     return rna_pointer_inherit_refine(ptr, &RNA_Object, ob);
482
483   return rna_pointer_inherit_refine(ptr, NULL, NULL);
484 }
485
486 static void rna_Curve_taperObject_set(PointerRNA *ptr,
487                                       PointerRNA value,
488                                       struct ReportList *UNUSED(reports))
489 {
490   Curve *cu = (Curve *)ptr->id.data;
491   Object *ob = (Object *)value.data;
492
493   if (ob) {
494     /* if taper object has got the save curve, as object, for which it's */
495     /* set as bevobj, there could be infinity loop in displist calculation */
496     if (ob->type == OB_CURVE && ob->data != cu) {
497       cu->taperobj = ob;
498       id_lib_extern((ID *)ob);
499     }
500   }
501   else {
502     cu->taperobj = NULL;
503   }
504 }
505
506 static void rna_Curve_resolution_u_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
507 {
508   Curve *cu = (Curve *)ptr->id.data;
509   ListBase *nurbs = BKE_curve_nurbs_get(cu);
510   Nurb *nu = nurbs->first;
511
512   while (nu) {
513     nu->resolu = cu->resolu;
514     nu = nu->next;
515   }
516
517   rna_Curve_update_data(bmain, scene, ptr);
518 }
519
520 static void rna_Curve_resolution_v_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
521 {
522   Curve *cu = (Curve *)ptr->id.data;
523   ListBase *nurbs = BKE_curve_nurbs_get(cu);
524   Nurb *nu = nurbs->first;
525
526   while (nu) {
527     nu->resolv = cu->resolv;
528     nu = nu->next;
529   }
530
531   rna_Curve_update_data(bmain, scene, ptr);
532 }
533
534 static float rna_Curve_offset_get(PointerRNA *ptr)
535 {
536   Curve *cu = (Curve *)ptr->id.data;
537   return cu->width - 1.0f;
538 }
539
540 static void rna_Curve_offset_set(PointerRNA *ptr, float value)
541 {
542   Curve *cu = (Curve *)ptr->id.data;
543   cu->width = 1.0f + value;
544 }
545
546 static int rna_Curve_body_length(PointerRNA *ptr);
547 static void rna_Curve_body_get(PointerRNA *ptr, char *value)
548 {
549   Curve *cu = (Curve *)ptr->id.data;
550   BLI_strncpy(value, cu->str, rna_Curve_body_length(ptr) + 1);
551 }
552
553 static int rna_Curve_body_length(PointerRNA *ptr)
554 {
555   Curve *cu = (Curve *)ptr->id.data;
556   return cu->len;
557 }
558
559 /* TODO, how to handle editmode? */
560 static void rna_Curve_body_set(PointerRNA *ptr, const char *value)
561 {
562   size_t len_bytes;
563   size_t len_chars = BLI_strlen_utf8_ex(value, &len_bytes);
564
565   Curve *cu = (Curve *)ptr->id.data;
566
567   cu->len_wchar = len_chars;
568   cu->len = len_bytes;
569   cu->pos = len_chars;
570
571   if (cu->str)
572     MEM_freeN(cu->str);
573   if (cu->strinfo)
574     MEM_freeN(cu->strinfo);
575
576   cu->str = MEM_mallocN(len_bytes + sizeof(wchar_t), "str");
577   cu->strinfo = MEM_callocN((len_chars + 4) * sizeof(CharInfo), "strinfo");
578
579   BLI_strncpy(cu->str, value, len_bytes + 1);
580 }
581
582 static void rna_Nurb_update_cyclic_u(Main *bmain, Scene *scene, PointerRNA *ptr)
583 {
584   Nurb *nu = (Nurb *)ptr->data;
585
586   if (nu->type == CU_BEZIER) {
587     BKE_nurb_handles_calc(nu);
588   }
589   else {
590     BKE_nurb_knot_calc_u(nu);
591   }
592
593   rna_Curve_update_data(bmain, scene, ptr);
594 }
595
596 static void rna_Nurb_update_cyclic_v(Main *bmain, Scene *scene, PointerRNA *ptr)
597 {
598   Nurb *nu = (Nurb *)ptr->data;
599
600   BKE_nurb_knot_calc_v(nu);
601
602   rna_Curve_update_data(bmain, scene, ptr);
603 }
604
605 static void rna_Nurb_update_knot_u(Main *bmain, Scene *scene, PointerRNA *ptr)
606 {
607   Nurb *nu = (Nurb *)ptr->data;
608
609   BKE_nurb_order_clamp_u(nu);
610   BKE_nurb_knot_calc_u(nu);
611
612   rna_Curve_update_data(bmain, scene, ptr);
613 }
614
615 static void rna_Nurb_update_knot_v(Main *bmain, Scene *scene, PointerRNA *ptr)
616 {
617   Nurb *nu = (Nurb *)ptr->data;
618
619   BKE_nurb_order_clamp_v(nu);
620   BKE_nurb_knot_calc_v(nu);
621
622   rna_Curve_update_data(bmain, scene, ptr);
623 }
624
625 static void rna_Curve_spline_points_add(ID *id, Nurb *nu, ReportList *reports, int number)
626 {
627   if (nu->type == CU_BEZIER) {
628     BKE_report(reports, RPT_ERROR, "Bezier spline cannot have points added");
629   }
630   else if (number == 0) {
631     /* do nothing */
632   }
633   else {
634
635     BKE_nurb_points_add(nu, number);
636
637     /* update */
638     BKE_nurb_knot_calc_u(nu);
639
640     rna_Curve_update_data_id(NULL, NULL, id);
641   }
642 }
643
644 static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, ReportList *reports, int number)
645 {
646   if (nu->type != CU_BEZIER) {
647     BKE_report(reports, RPT_ERROR, "Only Bezier splines can be added");
648   }
649   else if (number == 0) {
650     /* do nothing */
651   }
652   else {
653     BKE_nurb_bezierPoints_add(nu, number);
654
655     /* update */
656     BKE_nurb_knot_calc_u(nu);
657
658     rna_Curve_update_data_id(NULL, NULL, id);
659   }
660 }
661
662 static Nurb *rna_Curve_spline_new(Curve *cu, int type)
663 {
664   Nurb *nu = (Nurb *)MEM_callocN(sizeof(Nurb), "spline.new");
665
666   if (type == CU_BEZIER) {
667     BezTriple *bezt = (BezTriple *)MEM_callocN(sizeof(BezTriple), "spline.new.bezt");
668     bezt->radius = 1.0;
669     nu->bezt = bezt;
670   }
671   else {
672     BPoint *bp = (BPoint *)MEM_callocN(sizeof(BPoint), "spline.new.bp");
673     bp->radius = 1.0f;
674     nu->bp = bp;
675   }
676
677   nu->type = type;
678   nu->pntsu = 1;
679   nu->pntsv = 1;
680
681   nu->orderu = nu->orderv = 4;
682   nu->resolu = nu->resolv = 12;
683   nu->flag = CU_SMOOTH;
684
685   if ((cu->flag & CU_3D) == 0) {
686     nu->flag |= CU_2D;
687   }
688
689   BLI_addtail(BKE_curve_nurbs_get(cu), nu);
690
691   return nu;
692 }
693
694 static void rna_Curve_spline_remove(Curve *cu, ReportList *reports, PointerRNA *nu_ptr)
695 {
696   Nurb *nu = nu_ptr->data;
697   ListBase *nurbs = BKE_curve_nurbs_get(cu);
698
699   if (BLI_remlink_safe(nurbs, nu) == false) {
700     BKE_reportf(reports, RPT_ERROR, "Curve '%s' does not contain spline given", cu->id.name + 2);
701     return;
702   }
703
704   BKE_nurb_free(nu);
705   RNA_POINTER_INVALIDATE(nu_ptr);
706
707   DEG_id_tag_update(&cu->id, ID_RECALC_GEOMETRY);
708   WM_main_add_notifier(NC_GEOM | ND_DATA, NULL);
709 }
710
711 static void rna_Curve_spline_clear(Curve *cu)
712 {
713   ListBase *nurbs = BKE_curve_nurbs_get(cu);
714
715   BKE_nurbList_free(nurbs);
716
717   DEG_id_tag_update(&cu->id, ID_RECALC_GEOMETRY);
718   WM_main_add_notifier(NC_GEOM | ND_DATA, NULL);
719 }
720
721 static PointerRNA rna_Curve_active_spline_get(PointerRNA *ptr)
722 {
723   Curve *cu = (Curve *)ptr->data;
724   Nurb *nu;
725   ListBase *nurbs = BKE_curve_nurbs_get(cu);
726
727   /* For curve outside editmode will set to -1,
728    * should be changed to be allowed outside of editmode. */
729   nu = BLI_findlink(nurbs, cu->actnu);
730
731   if (nu)
732     return rna_pointer_inherit_refine(ptr, &RNA_Spline, nu);
733
734   return rna_pointer_inherit_refine(ptr, NULL, NULL);
735 }
736
737 static void rna_Curve_active_spline_set(PointerRNA *ptr,
738                                         PointerRNA value,
739                                         struct ReportList *UNUSED(reports))
740 {
741   Curve *cu = (Curve *)ptr->data;
742   Nurb *nu = value.data;
743   ListBase *nubase = BKE_curve_nurbs_get(cu);
744
745   /* -1 is ok for an unset index */
746   if (nu == NULL)
747     cu->actnu = -1;
748   else
749     cu->actnu = BLI_findindex(nubase, nu);
750 }
751
752 static char *rna_Curve_spline_path(PointerRNA *ptr)
753 {
754   Curve *cu = (Curve *)ptr->id.data;
755   ListBase *nubase = BKE_curve_nurbs_get(cu);
756   Nurb *nu = ptr->data;
757   int index = BLI_findindex(nubase, nu);
758
759   if (index >= 0)
760     return BLI_sprintfN("splines[%d]", index);
761   else
762     return BLI_strdup("");
763 }
764
765 /* use for both bezier and nurbs */
766 static char *rna_Curve_spline_point_path(PointerRNA *ptr)
767 {
768   Curve *cu = (Curve *)ptr->id.data;
769   Nurb *nu;
770   void *point = ptr->data;
771   int nu_index, pt_index;
772
773   nu = curve_nurb_from_point(cu, point, &nu_index, &pt_index);
774
775   if (nu) {
776     if (nu->type == CU_BEZIER) {
777       return BLI_sprintfN("splines[%d].bezier_points[%d]", nu_index, pt_index);
778     }
779     else {
780       return BLI_sprintfN("splines[%d].points[%d]", nu_index, pt_index);
781     }
782   }
783   else {
784     return BLI_strdup("");
785   }
786 }
787
788 static char *rna_TextBox_path(PointerRNA *ptr)
789 {
790   Curve *cu = (Curve *)ptr->id.data;
791   TextBox *tb = ptr->data;
792   int index = (int)(tb - cu->tb);
793
794   if (index >= 0 && index < cu->totbox)
795     return BLI_sprintfN("text_boxes[%d]", index);
796   else
797     return BLI_strdup("");
798 }
799
800 static void rna_Curve_splines_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
801 {
802   Curve *cu = (Curve *)ptr->id.data;
803   rna_iterator_listbase_begin(iter, BKE_curve_nurbs_get(cu), NULL);
804 }
805
806 static bool rna_Curve_is_editmode_get(PointerRNA *ptr)
807 {
808   Curve *cu = (Curve *)ptr->id.data;
809   const short type = BKE_curve_type_get(cu);
810   if (type == OB_FONT) {
811     return (cu->editfont != NULL);
812   }
813   else {
814     return (cu->editnurb != NULL);
815   }
816 }
817
818 #else
819
820 static const float tilt_limit = DEG2RADF(21600.0f);
821
822 static void rna_def_bpoint(BlenderRNA *brna)
823 {
824   StructRNA *srna;
825   PropertyRNA *prop;
826
827   srna = RNA_def_struct(brna, "SplinePoint", NULL);
828   RNA_def_struct_sdna(srna, "BPoint");
829   RNA_def_struct_ui_text(srna, "SplinePoint", "Spline point without handles");
830
831   /* Boolean values */
832   prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
833   RNA_def_property_boolean_sdna(prop, NULL, "f1", 0);
834   RNA_def_property_ui_text(prop, "Select", "Selection status");
835   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
836
837   prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
838   RNA_def_property_boolean_sdna(prop, NULL, "hide", 0);
839   RNA_def_property_ui_text(prop, "Hide", "Visibility status");
840   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
841
842   /* Vector value */
843   prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
844   RNA_def_property_array(prop, 3);
845   RNA_def_property_float_sdna(prop, NULL, "vec");
846   RNA_def_property_ui_text(prop, "Point", "Point coordinates");
847   RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
848   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
849
850   prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
851   RNA_def_property_float_sdna(prop, NULL, "vec[3]");
852   RNA_def_property_ui_text(prop, "Weight", "NURBS weight");
853   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
854
855   /* Number values */
856   prop = RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_ANGLE);
857   RNA_def_property_range(prop, -tilt_limit, tilt_limit);
858   RNA_def_property_ui_range(prop, -tilt_limit, tilt_limit, 10, 3);
859   RNA_def_property_ui_text(prop, "Tilt", "Tilt in 3D View");
860   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
861
862   prop = RNA_def_property(srna, "weight_softbody", PROP_FLOAT, PROP_NONE);
863   RNA_def_property_float_sdna(prop, NULL, "weight");
864   RNA_def_property_range(prop, 0.01f, 100.0f);
865   RNA_def_property_ui_text(prop, "Weight", "Softbody goal weight");
866   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
867
868   prop = RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
869   RNA_def_property_float_sdna(prop, NULL, "radius");
870   RNA_def_property_range(prop, 0.0f, FLT_MAX);
871   RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for beveling");
872   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
873
874   RNA_def_struct_path_func(srna, "rna_Curve_spline_point_path");
875 }
876
877 static void rna_def_beztriple(BlenderRNA *brna)
878 {
879   StructRNA *srna;
880   PropertyRNA *prop;
881
882   srna = RNA_def_struct(brna, "BezierSplinePoint", NULL);
883   RNA_def_struct_sdna(srna, "BezTriple");
884   RNA_def_struct_ui_text(srna, "Bezier Curve Point", "Bezier curve point with two handles");
885
886   /* Boolean values */
887   prop = RNA_def_property(srna, "select_left_handle", PROP_BOOLEAN, PROP_NONE);
888   RNA_def_property_boolean_sdna(prop, NULL, "f1", 0);
889   RNA_def_property_ui_text(prop, "Handle 1 selected", "Handle 1 selection status");
890   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
891
892   prop = RNA_def_property(srna, "select_right_handle", PROP_BOOLEAN, PROP_NONE);
893   RNA_def_property_boolean_sdna(prop, NULL, "f3", 0);
894   RNA_def_property_ui_text(prop, "Handle 2 selected", "Handle 2 selection status");
895   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
896
897   prop = RNA_def_property(srna, "select_control_point", PROP_BOOLEAN, PROP_NONE);
898   RNA_def_property_boolean_sdna(prop, NULL, "f2", 0);
899   RNA_def_property_ui_text(prop, "Control Point selected", "Control point selection status");
900   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
901
902   prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
903   RNA_def_property_boolean_sdna(prop, NULL, "hide", 0);
904   RNA_def_property_ui_text(prop, "Hide", "Visibility status");
905   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
906
907   /* Enums */
908   prop = RNA_def_property(srna, "handle_left_type", PROP_ENUM, PROP_NONE);
909   RNA_def_property_enum_sdna(prop, NULL, "h1");
910   RNA_def_property_enum_items(prop, beztriple_handle_type_items);
911   RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle types");
912   RNA_def_property_update(prop, 0, "rna_Curve_update_points");
913
914   prop = RNA_def_property(srna, "handle_right_type", PROP_ENUM, PROP_NONE);
915   RNA_def_property_enum_sdna(prop, NULL, "h2");
916   RNA_def_property_enum_items(prop, beztriple_handle_type_items);
917   RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle types");
918   RNA_def_property_update(prop, 0, "rna_Curve_update_points");
919
920   /* Vector values */
921   prop = RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
922   RNA_def_property_array(prop, 3);
923   RNA_def_property_float_funcs(
924       prop, "rna_BezTriple_handle1_get", "rna_BezTriple_handle1_set", NULL);
925   RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle");
926   RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
927   RNA_def_property_update(prop, 0, "rna_Curve_update_points");
928
929   prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
930   RNA_def_property_array(prop, 3);
931   RNA_def_property_float_funcs(
932       prop, "rna_BezTriple_ctrlpoint_get", "rna_BezTriple_ctrlpoint_set", NULL);
933   RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
934   RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
935   RNA_def_property_update(prop, 0, "rna_Curve_update_points");
936
937   prop = RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
938   RNA_def_property_array(prop, 3);
939   RNA_def_property_float_funcs(
940       prop, "rna_BezTriple_handle2_get", "rna_BezTriple_handle2_set", NULL);
941   RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle");
942   RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
943   RNA_def_property_update(prop, 0, "rna_Curve_update_points");
944
945   /* Number values */
946   prop = RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_ANGLE);
947   RNA_def_property_range(prop, -tilt_limit, tilt_limit);
948   RNA_def_property_ui_range(prop, -tilt_limit, tilt_limit, 10, 3);
949   RNA_def_property_ui_text(prop, "Tilt", "Tilt in 3D View");
950   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
951
952   prop = RNA_def_property(srna, "weight_softbody", PROP_FLOAT, PROP_NONE);
953   RNA_def_property_float_sdna(prop, NULL, "weight");
954   RNA_def_property_range(prop, 0.01f, 100.0f);
955   RNA_def_property_ui_text(prop, "Weight", "Softbody goal weight");
956   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
957
958   prop = RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
959   RNA_def_property_float_sdna(prop, NULL, "radius");
960   RNA_def_property_range(prop, 0.0f, FLT_MAX);
961   RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for beveling");
962   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
963
964   RNA_def_struct_path_func(srna, "rna_Curve_spline_point_path");
965 }
966
967 static void rna_def_path(BlenderRNA *UNUSED(brna), StructRNA *srna)
968 {
969   PropertyRNA *prop;
970
971   /* number values */
972   prop = RNA_def_property(srna, "path_duration", PROP_INT, PROP_TIME);
973   RNA_def_property_int_sdna(prop, NULL, "pathlen");
974   RNA_def_property_range(prop, 1, MAXFRAME);
975   RNA_def_property_ui_text(prop,
976                            "Path Length",
977                            "The number of frames that are needed to traverse the path, "
978                            "defining the maximum value for the 'Evaluation Time' setting");
979   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
980
981   /* flags */
982   prop = RNA_def_property(srna, "use_path", PROP_BOOLEAN, PROP_NONE);
983   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_PATH);
984   RNA_def_property_ui_text(prop, "Path", "Enable the curve to become a translation path");
985   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
986
987   prop = RNA_def_property(srna, "use_path_follow", PROP_BOOLEAN, PROP_NONE);
988   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FOLLOW);
989   RNA_def_property_ui_text(prop, "Follow", "Make curve path children to rotate along the path");
990   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
991
992   prop = RNA_def_property(srna, "use_stretch", PROP_BOOLEAN, PROP_NONE);
993   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_STRETCH);
994   RNA_def_property_ui_text(prop,
995                            "Stretch",
996                            "Option for curve-deform: "
997                            "make deformed child to stretch along entire path");
998   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
999
1000   prop = RNA_def_property(srna, "use_deform_bounds", PROP_BOOLEAN, PROP_NONE);
1001   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CU_DEFORM_BOUNDS_OFF);
1002   RNA_def_property_ui_text(prop,
1003                            "Bounds Clamp",
1004                            "Option for curve-deform: "
1005                            "Use the mesh bounds to clamp the deformation");
1006   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1007
1008   prop = RNA_def_property(srna, "use_radius", PROP_BOOLEAN, PROP_NONE);
1009   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_PATH_RADIUS);
1010   RNA_def_property_ui_text(prop,
1011                            "Radius",
1012                            "Option for paths and curve-deform: "
1013                            "apply the curve radius with path following it and deforming");
1014   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1015 }
1016
1017 static void rna_def_nurbs(BlenderRNA *UNUSED(brna), StructRNA *srna)
1018 {
1019   PropertyRNA *prop;
1020
1021   /* flags */
1022   prop = RNA_def_property(srna, "use_uv_as_generated", PROP_BOOLEAN, PROP_NONE);
1023   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
1024   RNA_def_property_ui_text(
1025       prop, "Use UV for Mapping", "Uses the UV values as Generated textured coordinates");
1026   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1027 }
1028
1029 static void rna_def_font(BlenderRNA *UNUSED(brna), StructRNA *srna)
1030 {
1031   PropertyRNA *prop;
1032
1033   static const EnumPropertyItem prop_align_items[] = {
1034       {CU_ALIGN_X_LEFT, "LEFT", ICON_ALIGN_LEFT, "Left", "Align text to the left"},
1035       {CU_ALIGN_X_MIDDLE, "CENTER", ICON_ALIGN_CENTER, "Center", "Center text"},
1036       {CU_ALIGN_X_RIGHT, "RIGHT", ICON_ALIGN_RIGHT, "Right", "Align text to the right"},
1037       {CU_ALIGN_X_JUSTIFY,
1038        "JUSTIFY",
1039        ICON_ALIGN_JUSTIFY,
1040        "Justify",
1041        "Align to the left and the right"},
1042       {CU_ALIGN_X_FLUSH,
1043        "FLUSH",
1044        ICON_ALIGN_FLUSH,
1045        "Flush",
1046        "Align to the left and the right, with equal character spacing"},
1047       {0, NULL, 0, NULL, NULL},
1048   };
1049
1050   static const EnumPropertyItem prop_align_y_items[] = {
1051       {CU_ALIGN_Y_TOP_BASELINE,
1052        "TOP_BASELINE",
1053        ICON_ALIGN_TOP,
1054        "Top Base-Line",
1055        "Align to top but use the base-line of the text"},
1056       {CU_ALIGN_Y_TOP, "TOP", ICON_ALIGN_TOP, "Top", "Align text to the top"},
1057       {CU_ALIGN_Y_CENTER, "CENTER", ICON_ALIGN_MIDDLE, "Center", "Align text to the middle"},
1058       {CU_ALIGN_Y_BOTTOM, "BOTTOM", ICON_ALIGN_BOTTOM, "Bottom", "Align text to the bottom"},
1059       {CU_ALIGN_Y_BOTTOM_BASELINE,
1060        "BOTTOM_BASELINE",
1061        ICON_ALIGN_BOTTOM,
1062        "Bottom Base-Line",
1063        "Align text to the bottom but use the base-line of the text"},
1064       {0, NULL, 0, NULL, NULL},
1065   };
1066
1067   static const EnumPropertyItem prop_overflow_items[] = {
1068       {CU_OVERFLOW_NONE, "NONE", 0, "Overflow", "Let the text overflow outside the text boxes"},
1069       {CU_OVERFLOW_SCALE,
1070        "SCALE",
1071        0,
1072        "Scale to Fit",
1073        "Scale down the text to fit inside the text boxes"},
1074       {CU_OVERFLOW_TRUNCATE,
1075        "TRUNCATE",
1076        0,
1077        "Truncate",
1078        "Truncate the text that would go outside the text boxes"},
1079       {0, NULL, 0, NULL, NULL},
1080   };
1081
1082   /* Enums */
1083   prop = RNA_def_property(srna, "align_x", PROP_ENUM, PROP_NONE);
1084   RNA_def_property_enum_sdna(prop, NULL, "spacemode");
1085   RNA_def_property_enum_items(prop, prop_align_items);
1086   RNA_def_property_ui_text(
1087       prop, "Text Horizontal Align", "Text horizontal align from the object center");
1088   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1089
1090   prop = RNA_def_property(srna, "align_y", PROP_ENUM, PROP_NONE);
1091   RNA_def_property_enum_sdna(prop, NULL, "align_y");
1092   RNA_def_property_enum_items(prop, prop_align_y_items);
1093   RNA_def_property_ui_text(
1094       prop, "Text Vertical Align", "Text vertical align from the object center");
1095   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1096
1097   prop = RNA_def_property(srna, "overflow", PROP_ENUM, PROP_NONE);
1098   RNA_def_property_enum_sdna(prop, NULL, "overflow");
1099   RNA_def_property_enum_items(prop, prop_overflow_items);
1100   RNA_def_property_enum_default(prop, CU_OVERFLOW_NONE);
1101   RNA_def_property_ui_text(
1102       prop, "Textbox Overflow", "Handle the text behavior when it doesn't fit in the text boxes");
1103   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1104
1105   /* number values */
1106   prop = RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
1107   RNA_def_property_float_sdna(prop, NULL, "fsize");
1108   RNA_def_property_range(prop, 0.0001f, 10000.0f);
1109   RNA_def_property_ui_range(prop, 0.01, 10, 1, 3);
1110   RNA_def_property_ui_text(prop, "Font size", "");
1111   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1112
1113   prop = RNA_def_property(srna, "small_caps_scale", PROP_FLOAT, PROP_NONE);
1114   RNA_def_property_float_sdna(prop, NULL, "smallcaps_scale");
1115   RNA_def_property_ui_range(prop, 0, 1.0, 1, 2);
1116   RNA_def_property_ui_text(prop, "Small Caps", "Scale of small capitals");
1117   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1118
1119   prop = RNA_def_property(srna, "space_line", PROP_FLOAT, PROP_NONE);
1120   RNA_def_property_float_sdna(prop, NULL, "linedist");
1121   RNA_def_property_range(prop, 0.0f, 10.0f);
1122   RNA_def_property_ui_text(prop, "Distance between lines of text", "");
1123   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1124
1125   prop = RNA_def_property(srna, "space_word", PROP_FLOAT, PROP_NONE);
1126   RNA_def_property_float_sdna(prop, NULL, "wordspace");
1127   RNA_def_property_range(prop, 0.0f, 10.0f);
1128   RNA_def_property_ui_text(prop, "Spacing between words", "");
1129   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1130
1131   prop = RNA_def_property(srna, "space_character", PROP_FLOAT, PROP_NONE);
1132   RNA_def_property_float_sdna(prop, NULL, "spacing");
1133   RNA_def_property_range(prop, 0.0f, 10.0f);
1134   RNA_def_property_ui_text(prop, "Global spacing between characters", "");
1135   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1136
1137   prop = RNA_def_property(srna, "shear", PROP_FLOAT, PROP_NONE);
1138   RNA_def_property_float_sdna(prop, NULL, "shear");
1139   RNA_def_property_range(prop, -1.0f, 1.0f);
1140   RNA_def_property_ui_text(prop, "Shear", "Italic angle of the characters");
1141   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1142
1143   prop = RNA_def_property(srna, "offset_x", PROP_FLOAT, PROP_DISTANCE);
1144   RNA_def_property_float_sdna(prop, NULL, "xof");
1145   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
1146   RNA_def_property_ui_range(prop, -50.0f, 50.0f, 10, 3);
1147   RNA_def_property_ui_text(prop, "X Offset", "Horizontal offset from the object origin");
1148   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1149
1150   prop = RNA_def_property(srna, "offset_y", PROP_FLOAT, PROP_DISTANCE);
1151   RNA_def_property_float_sdna(prop, NULL, "yof");
1152   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
1153   RNA_def_property_ui_range(prop, -50.0f, 50.0f, 10, 3);
1154   RNA_def_property_ui_text(prop, "Y Offset", "Vertical offset from the object origin");
1155   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1156
1157   prop = RNA_def_property(srna, "underline_position", PROP_FLOAT, PROP_NONE);
1158   RNA_def_property_float_sdna(prop, NULL, "ulpos");
1159   RNA_def_property_range(prop, -0.2f, 0.8f);
1160   RNA_def_property_ui_text(prop, "Underline Position", "Vertical position of underline");
1161   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1162
1163   prop = RNA_def_property(srna, "underline_height", PROP_FLOAT, PROP_NONE);
1164   RNA_def_property_float_sdna(prop, NULL, "ulheight");
1165   RNA_def_property_range(prop, 0.0f, 0.8f);
1166   RNA_def_property_ui_text(prop, "Underline Thickness", "");
1167   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1168
1169   prop = RNA_def_property(srna, "text_boxes", PROP_COLLECTION, PROP_NONE);
1170   RNA_def_property_collection_sdna(prop, NULL, "tb", "totbox");
1171   RNA_def_property_struct_type(prop, "TextBox");
1172   RNA_def_property_ui_text(prop, "Textboxes", "");
1173
1174   prop = RNA_def_property(srna, "active_textbox", PROP_INT, PROP_NONE);
1175   RNA_def_property_int_sdna(prop, NULL, "actbox");
1176   RNA_def_property_ui_text(prop, "The active text box", "");
1177   RNA_def_property_int_funcs(prop, NULL, NULL, "rna_Curve_active_textbox_index_range");
1178
1179   /* strings */
1180   prop = RNA_def_property(srna, "family", PROP_STRING, PROP_NONE);
1181   RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
1182   RNA_def_property_ui_text(
1183       prop,
1184       "Object Font",
1185       "Use Objects as font characters (give font objects a common name "
1186       "followed by the character they represent, eg. 'family-a', 'family-b', etc, "
1187       "set this setting to 'family-', and turn on Vertex Duplication)");
1188   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1189
1190   prop = RNA_def_property(srna, "body", PROP_STRING, PROP_NONE);
1191   RNA_def_property_string_sdna(prop, NULL, "str");
1192   RNA_def_property_ui_text(prop, "Body Text", "Content of this text object");
1193   RNA_def_property_string_funcs(
1194       prop, "rna_Curve_body_get", "rna_Curve_body_length", "rna_Curve_body_set");
1195   RNA_def_property_string_maxlength(prop,
1196                                     8192); /* note that originally str did not have a limit! */
1197   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1198
1199   prop = RNA_def_property(srna, "body_format", PROP_COLLECTION, PROP_NONE);
1200   RNA_def_property_collection_sdna(prop, NULL, "strinfo", "len_wchar");
1201   RNA_def_property_struct_type(prop, "TextCharacterFormat");
1202   RNA_def_property_ui_text(prop, "Character Info", "Stores the style of each character");
1203
1204   /* pointers */
1205   prop = RNA_def_property(srna, "follow_curve", PROP_POINTER, PROP_NONE);
1206   RNA_def_property_pointer_sdna(prop, NULL, "textoncurve");
1207   RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Curve_otherObject_poll");
1208   RNA_def_property_flag(prop, PROP_EDITABLE);
1209   RNA_def_property_ui_text(prop, "Text on Curve", "Curve deforming text object");
1210   RNA_def_property_update(prop, 0, "rna_Curve_update_deps");
1211
1212   prop = RNA_def_property(srna, "font", PROP_POINTER, PROP_NONE);
1213   RNA_def_property_pointer_sdna(prop, NULL, "vfont");
1214   RNA_def_property_ui_text(prop, "Font", "");
1215   RNA_def_property_flag(prop, PROP_EDITABLE);
1216   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1217
1218   prop = RNA_def_property(srna, "font_bold", PROP_POINTER, PROP_NONE);
1219   RNA_def_property_pointer_sdna(prop, NULL, "vfontb");
1220   RNA_def_property_ui_text(prop, "Font Bold", "");
1221   RNA_def_property_flag(prop, PROP_EDITABLE);
1222   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1223
1224   prop = RNA_def_property(srna, "font_italic", PROP_POINTER, PROP_NONE);
1225   RNA_def_property_pointer_sdna(prop, NULL, "vfonti");
1226   RNA_def_property_ui_text(prop, "Font Italic", "");
1227   RNA_def_property_flag(prop, PROP_EDITABLE);
1228   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1229
1230   prop = RNA_def_property(srna, "font_bold_italic", PROP_POINTER, PROP_NONE);
1231   RNA_def_property_pointer_sdna(prop, NULL, "vfontbi");
1232   RNA_def_property_ui_text(prop, "Font Bold Italic", "");
1233   RNA_def_property_flag(prop, PROP_EDITABLE);
1234   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1235
1236   prop = RNA_def_property(srna, "edit_format", PROP_POINTER, PROP_NONE);
1237   RNA_def_property_pointer_sdna(prop, NULL, "curinfo");
1238   RNA_def_property_ui_text(prop, "Edit Format", "Editing settings character formatting");
1239   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1240
1241   /* flags */
1242   prop = RNA_def_property(srna, "use_fast_edit", PROP_BOOLEAN, PROP_NONE);
1243   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FAST);
1244   RNA_def_property_ui_text(prop, "Fast Editing", "Don't fill polygons while editing");
1245   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1246 }
1247
1248 static void rna_def_textbox(BlenderRNA *brna)
1249 {
1250   StructRNA *srna;
1251   PropertyRNA *prop;
1252
1253   srna = RNA_def_struct(brna, "TextBox", NULL);
1254   RNA_def_struct_ui_text(srna, "Text Box", "Text bounding box for layout");
1255
1256   /* number values */
1257   prop = RNA_def_property(srna, "x", PROP_FLOAT, PROP_DISTANCE);
1258   RNA_def_property_float_sdna(prop, NULL, "x");
1259   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
1260   RNA_def_property_ui_range(prop, -50.0f, 50.0f, 10, 3);
1261   RNA_def_property_ui_text(prop, "Textbox X Offset", "");
1262   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1263
1264   prop = RNA_def_property(srna, "y", PROP_FLOAT, PROP_DISTANCE);
1265   RNA_def_property_float_sdna(prop, NULL, "y");
1266   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
1267   RNA_def_property_ui_range(prop, -50.0f, 50.0f, 10, 3);
1268   RNA_def_property_ui_text(prop, "Textbox Y Offset", "");
1269   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1270
1271   prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_DISTANCE);
1272   RNA_def_property_float_sdna(prop, NULL, "w");
1273   RNA_def_property_range(prop, 0.0f, FLT_MAX);
1274   RNA_def_property_ui_range(prop, 0.0f, 50.0f, 10, 3);
1275   RNA_def_property_ui_text(prop, "Textbox Width", "");
1276   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1277
1278   prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
1279   RNA_def_property_float_sdna(prop, NULL, "h");
1280   RNA_def_property_range(prop, 0.0f, FLT_MAX);
1281   RNA_def_property_ui_range(prop, 0.0f, 50.0f, 10, 3);
1282   RNA_def_property_ui_text(prop, "Textbox Height", "");
1283   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1284
1285   RNA_def_struct_path_func(srna, "rna_TextBox_path");
1286 }
1287
1288 static void rna_def_charinfo(BlenderRNA *brna)
1289 {
1290   StructRNA *srna;
1291   PropertyRNA *prop;
1292
1293   srna = RNA_def_struct(brna, "TextCharacterFormat", NULL);
1294   RNA_def_struct_sdna(srna, "CharInfo");
1295   RNA_def_struct_ui_text(srna, "Text Character Format", "Text character formatting settings");
1296
1297   /* flags */
1298   prop = RNA_def_property(srna, "use_bold", PROP_BOOLEAN, PROP_NONE);
1299   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_BOLD);
1300   RNA_def_property_ui_text(prop, "Bold", "");
1301   RNA_def_property_ui_icon(prop, ICON_BOLD, 0);
1302   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1303
1304   prop = RNA_def_property(srna, "use_italic", PROP_BOOLEAN, PROP_NONE);
1305   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_ITALIC);
1306   RNA_def_property_ui_text(prop, "Italic", "");
1307   RNA_def_property_ui_icon(prop, ICON_ITALIC, 0);
1308   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1309
1310   prop = RNA_def_property(srna, "use_underline", PROP_BOOLEAN, PROP_NONE);
1311   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_UNDERLINE);
1312   RNA_def_property_ui_text(prop, "Underline", "");
1313   RNA_def_property_ui_icon(prop, ICON_UNDERLINE, 0);
1314   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1315
1316   /* probably there is no reason to expose this */
1317 #  if 0
1318   prop = RNA_def_property(srna, "use_wrap", PROP_BOOLEAN, PROP_NONE);
1319   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_WRAP);
1320   RNA_def_property_ui_text(prop, "Wrap", "");
1321   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1322 #  endif
1323
1324   prop = RNA_def_property(srna, "use_small_caps", PROP_BOOLEAN, PROP_NONE);
1325   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_SMALLCAPS);
1326   RNA_def_property_ui_text(prop, "Small Caps", "");
1327   RNA_def_property_ui_icon(prop, ICON_SMALL_CAPS, 0);
1328   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1329
1330   prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
1331   // RNA_def_property_int_sdna(prop, NULL, "mat_nr");
1332   RNA_def_property_ui_text(prop, "Material Index", "");
1333   RNA_def_property_int_funcs(prop,
1334                              "rna_ChariInfo_material_index_get",
1335                              "rna_ChariInfo_material_index_set",
1336                              "rna_Curve_material_index_range");
1337   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1338
1339   prop = RNA_def_property(srna, "kerning", PROP_INT, PROP_UNSIGNED);
1340   RNA_def_property_int_sdna(prop, NULL, "kern");
1341   RNA_def_property_ui_text(prop, "Kerning", "Spacing between characters");
1342   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1343 }
1344
1345 static void rna_def_surface(BlenderRNA *brna)
1346 {
1347   StructRNA *srna;
1348
1349   srna = RNA_def_struct(brna, "SurfaceCurve", "Curve");
1350   RNA_def_struct_sdna(srna, "Curve");
1351   RNA_def_struct_ui_text(srna, "Surface Curve", "Curve data-block used for storing surfaces");
1352   RNA_def_struct_ui_icon(srna, ICON_SURFACE_DATA);
1353
1354   rna_def_nurbs(brna, srna);
1355 }
1356
1357 static void rna_def_text(BlenderRNA *brna)
1358 {
1359   StructRNA *srna;
1360
1361   srna = RNA_def_struct(brna, "TextCurve", "Curve");
1362   RNA_def_struct_sdna(srna, "Curve");
1363   RNA_def_struct_ui_text(srna, "Text Curve", "Curve data-block used for storing text");
1364   RNA_def_struct_ui_icon(srna, ICON_FONT_DATA);
1365
1366   rna_def_font(brna, srna);
1367   rna_def_nurbs(brna, srna);
1368 }
1369
1370 /* curve.splines[0].points */
1371 static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
1372 {
1373   StructRNA *srna;
1374   /*PropertyRNA *prop; */
1375
1376   FunctionRNA *func;
1377   PropertyRNA *parm;
1378
1379   RNA_def_property_srna(cprop, "SplinePoints");
1380   srna = RNA_def_struct(brna, "SplinePoints", NULL);
1381   RNA_def_struct_sdna(srna, "Nurb");
1382   RNA_def_struct_ui_text(srna, "Spline Points", "Collection of spline points");
1383
1384   func = RNA_def_function(srna, "add", "rna_Curve_spline_points_add");
1385   RNA_def_function_ui_description(func, "Add a number of points to this spline");
1386   RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS);
1387   parm = RNA_def_int(
1388       func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
1389   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
1390
1391 #  if 0
1392   func = RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
1393   RNA_def_function_ui_description(func, "Remove a spline from a curve");
1394   RNA_def_function_flag(func, FUNC_USE_REPORTS);
1395   parm = RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove");
1396   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
1397   RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
1398 #  endif
1399 }
1400
1401 static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
1402 {
1403   StructRNA *srna;
1404   /*PropertyRNA *prop; */
1405
1406   FunctionRNA *func;
1407   PropertyRNA *parm;
1408
1409   RNA_def_property_srna(cprop, "SplineBezierPoints");
1410   srna = RNA_def_struct(brna, "SplineBezierPoints", NULL);
1411   RNA_def_struct_sdna(srna, "Nurb");
1412   RNA_def_struct_ui_text(srna, "Spline Bezier Points", "Collection of spline Bezier points");
1413
1414   func = RNA_def_function(srna, "add", "rna_Curve_spline_bezpoints_add");
1415   RNA_def_function_ui_description(func, "Add a number of points to this spline");
1416   RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS);
1417   parm = RNA_def_int(
1418       func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
1419   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
1420
1421 #  if 0
1422   func = RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
1423   RNA_def_function_ui_description(func, "Remove a spline from a curve");
1424   RNA_def_function_flag(func, FUNC_USE_REPORTS);
1425   parm = RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove");
1426   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
1427   RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
1428 #  endif
1429 }
1430
1431 /* curve.splines */
1432 static void rna_def_curve_splines(BlenderRNA *brna, PropertyRNA *cprop)
1433 {
1434   StructRNA *srna;
1435   PropertyRNA *prop;
1436
1437   FunctionRNA *func;
1438   PropertyRNA *parm;
1439
1440   RNA_def_property_srna(cprop, "CurveSplines");
1441   srna = RNA_def_struct(brna, "CurveSplines", NULL);
1442   RNA_def_struct_sdna(srna, "Curve");
1443   RNA_def_struct_ui_text(srna, "Curve Splines", "Collection of curve splines");
1444
1445   func = RNA_def_function(srna, "new", "rna_Curve_spline_new");
1446   RNA_def_function_ui_description(func, "Add a new spline to the curve");
1447   parm = RNA_def_enum(func, "type", curve_type_items, CU_POLY, "", "type for the new spline");
1448   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
1449   parm = RNA_def_pointer(func, "spline", "Spline", "", "The newly created spline");
1450   RNA_def_function_return(func, parm);
1451
1452   func = RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
1453   RNA_def_function_ui_description(func, "Remove a spline from a curve");
1454   RNA_def_function_flag(func, FUNC_USE_REPORTS);
1455   parm = RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove");
1456   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
1457   RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
1458
1459   func = RNA_def_function(srna, "clear", "rna_Curve_spline_clear");
1460   RNA_def_function_ui_description(func, "Remove all splines from a curve");
1461
1462   prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
1463   RNA_def_property_struct_type(prop, "Spline");
1464   RNA_def_property_pointer_funcs(
1465       prop, "rna_Curve_active_spline_get", "rna_Curve_active_spline_set", NULL, NULL);
1466   RNA_def_property_flag(prop, PROP_EDITABLE);
1467   RNA_def_property_ui_text(prop, "Active Spline", "Active curve spline");
1468 }
1469
1470 static void rna_def_curve(BlenderRNA *brna)
1471 {
1472   StructRNA *srna;
1473   PropertyRNA *prop;
1474
1475   static const EnumPropertyItem curve_twist_mode_items[] = {
1476       {CU_TWIST_Z_UP,
1477        "Z_UP",
1478        0,
1479        "Z-Up",
1480        "Use Z-Up axis to calculate the curve twist at each point"},
1481       {CU_TWIST_MINIMUM, "MINIMUM", 0, "Minimum", "Use the least twist over the entire curve"},
1482       {CU_TWIST_TANGENT, "TANGENT", 0, "Tangent", "Use the tangent to calculate twist"},
1483       {0, NULL, 0, NULL, NULL},
1484   };
1485
1486   static const EnumPropertyItem curve_axis_items[] = {
1487       {0, "2D", 0, "2D", "Clamp the Z axis of the curve"},
1488       {CU_3D,
1489        "3D",
1490        0,
1491        "3D",
1492        "Allow editing on the Z axis of this curve, also allows tilt and curve radius to be used"},
1493       {0, NULL, 0, NULL, NULL},
1494   };
1495
1496   static const EnumPropertyItem bevfac_mapping_items[] = {
1497       {CU_BEVFAC_MAP_RESOLU,
1498        "RESOLUTION",
1499        0,
1500        "Resolution",
1501        "Map the bevel factor to the number of subdivisions of a spline (U resolution)"},
1502       {CU_BEVFAC_MAP_SEGMENT,
1503        "SEGMENTS",
1504        0,
1505        "Segments",
1506        "Map the bevel factor to the length of a segment and to the number of subdivisions of a "
1507        "segment"},
1508       {CU_BEVFAC_MAP_SPLINE,
1509        "SPLINE",
1510        0,
1511        "Spline",
1512        "Map the bevel factor to the length of a spline"},
1513       {0, NULL, 0, NULL, NULL},
1514   };
1515
1516   srna = RNA_def_struct(brna, "Curve", "ID");
1517   RNA_def_struct_ui_text(srna, "Curve", "Curve data-block storing curves, splines and NURBS");
1518   RNA_def_struct_ui_icon(srna, ICON_CURVE_DATA);
1519   RNA_def_struct_refine_func(srna, "rna_Curve_refine");
1520
1521   prop = RNA_def_property(srna, "shape_keys", PROP_POINTER, PROP_NONE);
1522   RNA_def_property_pointer_sdna(prop, NULL, "key");
1523   RNA_def_property_ui_text(prop, "Shape Keys", "");
1524
1525   prop = RNA_def_property(srna, "splines", PROP_COLLECTION, PROP_NONE);
1526 #  if 0
1527   RNA_def_property_collection_sdna(prop, NULL, "nurb", NULL);
1528 #  else
1529   /* this way we get editmode nurbs too, keyframe in editmode */
1530   RNA_def_property_collection_funcs(prop,
1531                                     "rna_Curve_splines_begin",
1532                                     "rna_iterator_listbase_next",
1533                                     "rna_iterator_listbase_end",
1534                                     "rna_iterator_listbase_get",
1535                                     NULL,
1536                                     NULL,
1537                                     NULL,
1538                                     NULL);
1539 #  endif
1540   RNA_def_property_struct_type(prop, "Spline");
1541   RNA_def_property_ui_text(prop, "Splines", "Collection of splines in this curve data object");
1542   rna_def_curve_splines(brna, prop);
1543
1544   rna_def_path(brna, srna);
1545
1546   /* Number values */
1547   prop = RNA_def_property(srna, "bevel_resolution", PROP_INT, PROP_NONE);
1548   RNA_def_property_int_sdna(prop, NULL, "bevresol");
1549   RNA_def_property_range(prop, 0, 32);
1550   RNA_def_property_ui_range(prop, 0, 32, 1.0, -1);
1551   RNA_def_property_ui_text(
1552       prop,
1553       "Bevel Resolution",
1554       "Bevel resolution when depth is non-zero and no specific bevel object has been defined");
1555   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1556
1557   prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE | PROP_UNIT_LENGTH);
1558   RNA_def_property_float_sdna(prop, NULL, "width");
1559   RNA_def_property_ui_range(prop, -1.0, 1.0, 0.1, 3);
1560   RNA_def_property_float_funcs(prop, "rna_Curve_offset_get", "rna_Curve_offset_set", NULL);
1561   RNA_def_property_ui_text(prop, "Offset", "Offset the curve to adjust the width of a text");
1562   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1563
1564   prop = RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE | PROP_UNIT_LENGTH);
1565   RNA_def_property_float_sdna(prop, NULL, "ext1");
1566   RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3);
1567   RNA_def_property_range(prop, 0.0, FLT_MAX);
1568   RNA_def_property_ui_text(
1569       prop, "Extrude", "Amount of curve extrusion when not using a bevel object");
1570   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1571
1572   prop = RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE | PROP_UNIT_LENGTH);
1573   RNA_def_property_float_sdna(prop, NULL, "ext2");
1574   RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3);
1575   RNA_def_property_ui_text(prop, "Bevel Depth", "Bevel depth when not using a bevel object");
1576   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1577
1578   prop = RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE);
1579   RNA_def_property_int_sdna(prop, NULL, "resolu");
1580   RNA_def_property_range(prop, 1, 1024);
1581   RNA_def_property_ui_range(prop, 1, 64, 1, -1);
1582   RNA_def_property_ui_text(prop, "Resolution U", "Surface resolution in U direction");
1583   RNA_def_property_update(prop, 0, "rna_Curve_resolution_u_update_data");
1584
1585   prop = RNA_def_property(srna, "resolution_v", PROP_INT, PROP_NONE);
1586   RNA_def_property_int_sdna(prop, NULL, "resolv");
1587   RNA_def_property_ui_range(prop, 1, 64, 1, -1);
1588   RNA_def_property_range(prop, 1, 1024);
1589   RNA_def_property_ui_text(prop, "Resolution V", "Surface resolution in V direction");
1590   RNA_def_property_update(prop, 0, "rna_Curve_resolution_v_update_data");
1591
1592   prop = RNA_def_property(srna, "render_resolution_u", PROP_INT, PROP_NONE);
1593   RNA_def_property_int_sdna(prop, NULL, "resolu_ren");
1594   RNA_def_property_range(prop, 0, 1024);
1595   RNA_def_property_ui_range(prop, 0, 64, 1, -1);
1596   RNA_def_property_ui_text(
1597       prop,
1598       "Render Resolution U",
1599       "Surface resolution in U direction used while rendering (zero uses preview resolution)");
1600
1601   prop = RNA_def_property(srna, "render_resolution_v", PROP_INT, PROP_NONE);
1602   RNA_def_property_int_sdna(prop, NULL, "resolv_ren");
1603   RNA_def_property_ui_range(prop, 0, 64, 1, -1);
1604   RNA_def_property_range(prop, 0, 1024);
1605   RNA_def_property_ui_text(
1606       prop,
1607       "Render Resolution V",
1608       "Surface resolution in V direction used while rendering (zero uses preview resolution)");
1609
1610   prop = RNA_def_property(srna, "eval_time", PROP_FLOAT, PROP_TIME);
1611   RNA_def_property_float_sdna(prop, NULL, "ctime");
1612   RNA_def_property_ui_text(
1613       prop,
1614       "Evaluation Time",
1615       "Parametric position along the length of the curve that Objects 'following' it should be "
1616       "at (position is evaluated by dividing by the 'Path Length' value)");
1617   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1618
1619   /* pointers */
1620   prop = RNA_def_property(srna, "bevel_object", PROP_POINTER, PROP_NONE);
1621   RNA_def_property_struct_type(prop, "Object");
1622   RNA_def_property_pointer_sdna(prop, NULL, "bevobj");
1623   RNA_def_property_flag(prop, PROP_EDITABLE);
1624   RNA_def_property_ui_text(prop, "Bevel Object", "Curve object name that defines the bevel shape");
1625   RNA_def_property_update(prop, 0, "rna_Curve_update_deps");
1626   RNA_def_property_pointer_funcs(prop,
1627                                  "rna_Curve_bevelObject_get",
1628                                  "rna_Curve_bevelObject_set",
1629                                  NULL,
1630                                  "rna_Curve_otherObject_poll");
1631
1632   prop = RNA_def_property(srna, "taper_object", PROP_POINTER, PROP_NONE);
1633   RNA_def_property_struct_type(prop, "Object");
1634   RNA_def_property_pointer_sdna(prop, NULL, "taperobj");
1635   RNA_def_property_flag(prop, PROP_EDITABLE);
1636   RNA_def_property_ui_text(
1637       prop, "Taper Object", "Curve object name that defines the taper (width)");
1638   RNA_def_property_update(prop, 0, "rna_Curve_update_deps");
1639   RNA_def_property_pointer_funcs(prop,
1640                                  "rna_Curve_taperObject_get",
1641                                  "rna_Curve_taperObject_set",
1642                                  NULL,
1643                                  "rna_Curve_otherObject_poll");
1644
1645   /* Flags */
1646
1647   prop = RNA_def_property(srna, "dimensions", PROP_ENUM, PROP_NONE); /* as an enum */
1648   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
1649   RNA_def_property_enum_items(prop, curve_axis_items);
1650   RNA_def_property_enum_funcs(prop, NULL, "rna_Curve_dimension_set", NULL);
1651   RNA_def_property_ui_text(prop, "Dimensions", "Select 2D or 3D curve type");
1652   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1653
1654   prop = RNA_def_property(srna, "fill_mode", PROP_ENUM, PROP_NONE);
1655   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
1656   RNA_def_property_enum_items(prop, curve3d_fill_mode_items);
1657   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Curve_fill_mode_itemf");
1658   RNA_def_property_ui_text(prop, "Fill Mode", "Mode of filling curve");
1659   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1660
1661   prop = RNA_def_property(srna, "twist_mode", PROP_ENUM, PROP_NONE);
1662   RNA_def_property_enum_sdna(prop, NULL, "twist_mode");
1663   RNA_def_property_enum_items(prop, curve_twist_mode_items);
1664   RNA_def_property_ui_text(prop, "Twist Method", "The type of tilt calculation for 3D Curves");
1665   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1666
1667   prop = RNA_def_property(srna, "bevel_factor_mapping_start", PROP_ENUM, PROP_NONE);
1668   RNA_def_property_enum_sdna(prop, NULL, "bevfac1_mapping");
1669   RNA_def_property_enum_items(prop, bevfac_mapping_items);
1670   RNA_def_property_ui_text(
1671       prop, "Start Mapping Type", "Determines how the start bevel factor is mapped to a spline");
1672   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1673
1674   prop = RNA_def_property(srna, "bevel_factor_mapping_end", PROP_ENUM, PROP_NONE);
1675   RNA_def_property_enum_sdna(prop, NULL, "bevfac2_mapping");
1676   RNA_def_property_enum_items(prop, bevfac_mapping_items);
1677   RNA_def_property_ui_text(
1678       prop, "End Mapping Type", "Determines how the end bevel factor is mapped to a spline");
1679   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1680
1681   /* XXX - would be nice to have a better way to do this, only add for testing. */
1682   prop = RNA_def_property(srna, "twist_smooth", PROP_FLOAT, PROP_NONE);
1683   RNA_def_property_float_sdna(prop, NULL, "twist_smooth");
1684   RNA_def_property_ui_range(prop, 0, 100.0, 1, 2);
1685   RNA_def_property_ui_text(prop, "Twist Smooth", "Smoothing iteration for tangents");
1686   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1687
1688   prop = RNA_def_property(srna, "use_fill_deform", PROP_BOOLEAN, PROP_NONE);
1689   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_DEFORM_FILL);
1690   RNA_def_property_ui_text(
1691       prop, "Fill Deformed", "Fill curve after applying shape keys and all modifiers");
1692   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1693
1694   prop = RNA_def_property(srna, "use_fill_caps", PROP_BOOLEAN, PROP_NONE);
1695   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FILL_CAPS);
1696   RNA_def_property_ui_text(prop, "Fill Caps", "Fill caps for beveled curves");
1697   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1698
1699   prop = RNA_def_property(srna, "use_map_taper", PROP_BOOLEAN, PROP_NONE);
1700   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_MAP_TAPER);
1701   RNA_def_property_ui_text(
1702       prop, "Map Taper", "Map effect of taper object on actually beveled curve");
1703   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1704
1705   /* texture space */
1706   prop = RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, PROP_NONE);
1707   RNA_def_property_boolean_sdna(prop, NULL, "texflag", CU_AUTOSPACE);
1708   RNA_def_property_ui_text(
1709       prop,
1710       "Auto Texture Space",
1711       "Adjust active object's texture space automatically when transforming object");
1712   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Curve_texspace_set");
1713
1714   prop = RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
1715   RNA_def_property_array(prop, 3);
1716   RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location");
1717   RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
1718   RNA_def_property_editable_func(prop, "rna_Curve_texspace_editable");
1719   RNA_def_property_float_funcs(
1720       prop, "rna_Curve_texspace_loc_get", "rna_Curve_texspace_loc_set", NULL);
1721   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1722
1723   prop = RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
1724   RNA_def_property_array(prop, 3);
1725   RNA_def_property_flag(prop, PROP_PROPORTIONAL);
1726   RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
1727   RNA_def_property_editable_func(prop, "rna_Curve_texspace_editable");
1728   RNA_def_property_float_funcs(
1729       prop, "rna_Curve_texspace_size_get", "rna_Curve_texspace_size_set", NULL);
1730   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1731
1732   /* not supported yet */
1733 #  if 0
1734   prop = RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
1735   RNA_def_property_float(prop, NULL, "rot");
1736   RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
1737   RNA_def_property_editable_func(prop, texspace_editable);
1738   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1739 #  endif
1740
1741   prop = RNA_def_property(srna, "use_uv_as_generated", PROP_BOOLEAN, PROP_NONE);
1742   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
1743   RNA_def_property_ui_text(
1744       prop, "Use UV for mapping", "Uses the UV values as Generated textured coordinates");
1745   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1746
1747   /* materials */
1748   prop = RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE);
1749   RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol");
1750   RNA_def_property_struct_type(prop, "Material");
1751   RNA_def_property_ui_text(prop, "Materials", "");
1752   RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */
1753   RNA_def_property_collection_funcs(
1754       prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int");
1755
1756   prop = RNA_def_property(srna, "bevel_factor_start", PROP_FLOAT, PROP_FACTOR);
1757   RNA_def_property_float_sdna(prop, NULL, "bevfac1");
1758   RNA_def_property_range(prop, 0, 1.0);
1759   RNA_def_property_ui_text(prop,
1760                            "Start Bevel Factor",
1761                            "Factor that defines from where beveling of spline happens (0=from the "
1762                            "very beginning, 1=from the very end)");
1763   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1764
1765   prop = RNA_def_property(srna, "bevel_factor_end", PROP_FLOAT, PROP_FACTOR);
1766   RNA_def_property_float_sdna(prop, NULL, "bevfac2");
1767   RNA_def_property_range(prop, 0, 1.0);
1768   RNA_def_property_ui_text(prop,
1769                            "End Bevel Factor",
1770                            "Factor that defines to where beveling of spline happens (0=to the "
1771                            "very beginning, 1=to the very end)");
1772   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1773
1774   prop = RNA_def_property(srna, "is_editmode", PROP_BOOLEAN, PROP_NONE);
1775   RNA_def_property_boolean_funcs(prop, "rna_Curve_is_editmode_get", NULL);
1776   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1777   RNA_def_property_ui_text(prop, "Is Editmode", "True when used in editmode");
1778
1779   rna_def_animdata_common(srna);
1780
1781   RNA_api_curve(srna);
1782 }
1783
1784 static void rna_def_curve_nurb(BlenderRNA *brna)
1785 {
1786   static const EnumPropertyItem spline_interpolation_items[] = {
1787       {KEY_LINEAR, "LINEAR", 0, "Linear", ""},
1788       {KEY_CARDINAL, "CARDINAL", 0, "Cardinal", ""},
1789       {KEY_BSPLINE, "BSPLINE", 0, "BSpline", ""},
1790       /* TODO: define somewhere, not one of BEZT_IPO_*. */
1791       {KEY_CU_EASE, "EASE", 0, "Ease", ""},
1792       {0, NULL, 0, NULL, NULL},
1793   };
1794
1795   StructRNA *srna;
1796   PropertyRNA *prop;
1797
1798   srna = RNA_def_struct(brna, "Spline", NULL);
1799   RNA_def_struct_sdna(srna, "Nurb");
1800   RNA_def_struct_ui_text(
1801       srna,
1802       "Spline",
1803       "Element of a curve, either NURBS, Bezier or Polyline or a character with text objects");
1804
1805   prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE);
1806   RNA_def_property_collection_sdna(prop, NULL, "bp", NULL);
1807   RNA_def_property_struct_type(prop, "SplinePoint");
1808   RNA_def_property_collection_funcs(prop,
1809                                     "rna_BPoint_array_begin",
1810                                     "rna_iterator_array_next",
1811                                     "rna_iterator_array_end",
1812                                     "rna_iterator_array_get",
1813                                     "rna_Nurb_length",
1814                                     NULL,
1815                                     NULL,
1816                                     NULL);
1817   RNA_def_property_ui_text(
1818       prop, "Points", "Collection of points that make up this poly or nurbs spline");
1819   rna_def_curve_spline_points(brna, prop);
1820
1821   prop = RNA_def_property(srna, "bezier_points", PROP_COLLECTION, PROP_NONE);
1822   RNA_def_property_struct_type(prop, "BezierSplinePoint");
1823   RNA_def_property_collection_sdna(prop, NULL, "bezt", "pntsu");
1824   RNA_def_property_ui_text(prop, "Bezier Points", "Collection of points for Bezier curves only");
1825   rna_def_curve_spline_bezpoints(brna, prop);
1826
1827   prop = RNA_def_property(srna, "tilt_interpolation", PROP_ENUM, PROP_NONE);
1828   RNA_def_property_enum_sdna(prop, NULL, "tilt_interp");
1829   RNA_def_property_enum_items(prop, spline_interpolation_items);
1830   RNA_def_property_ui_text(
1831       prop, "Tilt Interpolation", "The type of tilt interpolation for 3D, Bezier curves");
1832   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1833
1834   prop = RNA_def_property(srna, "radius_interpolation", PROP_ENUM, PROP_NONE);
1835   RNA_def_property_enum_sdna(prop, NULL, "radius_interp");
1836   RNA_def_property_enum_items(prop, spline_interpolation_items);
1837   RNA_def_property_ui_text(
1838       prop, "Radius Interpolation", "The type of radius interpolation for Bezier curves");
1839   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1840
1841   prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
1842   RNA_def_property_enum_items(prop, curve_type_items);
1843   RNA_def_property_enum_funcs(prop, NULL, "rna_Nurb_type_set", NULL);
1844   RNA_def_property_ui_text(prop, "Type", "The interpolation type for this curve element");
1845   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1846
1847   prop = RNA_def_property(srna, "point_count_u", PROP_INT, PROP_UNSIGNED);
1848   RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
1849   RNA_def_property_int_sdna(prop, NULL, "pntsu");
1850   RNA_def_property_ui_text(
1851       prop, "Points U", "Total number points for the curve or surface in the U direction");
1852   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1853
1854   prop = RNA_def_property(srna, "point_count_v", PROP_INT, PROP_UNSIGNED);
1855   RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
1856   RNA_def_property_int_sdna(prop, NULL, "pntsv");
1857   RNA_def_property_ui_text(
1858       prop, "Points V", "Total number points for the surface on the V direction");
1859   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1860
1861   prop = RNA_def_property(srna, "order_u", PROP_INT, PROP_NONE);
1862   RNA_def_property_int_sdna(prop, NULL, "orderu");
1863   RNA_def_property_range(prop, 2, 6);
1864   RNA_def_property_ui_text(
1865       prop,
1866       "Order U",
1867       "NURBS order in the U direction (for splines and surfaces, higher values "
1868       "let points influence a greater area)");
1869   RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u");
1870
1871   prop = RNA_def_property(srna, "order_v", PROP_INT, PROP_NONE);
1872   RNA_def_property_int_sdna(prop, NULL, "orderv");
1873   RNA_def_property_range(prop, 2, 6);
1874   RNA_def_property_ui_text(prop,
1875                            "Order V",
1876                            "NURBS order in the V direction (for surfaces only, higher values "
1877                            "let points influence a greater area)");
1878   RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v");
1879
1880   prop = RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE);
1881   RNA_def_property_int_sdna(prop, NULL, "resolu");
1882   RNA_def_property_range(prop, 1, 1024);
1883   RNA_def_property_ui_range(prop, 1, 64, 1, -1);
1884   RNA_def_property_ui_text(prop, "Resolution U", "Curve or Surface subdivisions per segment");
1885   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1886
1887   prop = RNA_def_property(srna, "resolution_v", PROP_INT, PROP_NONE);
1888   RNA_def_property_int_sdna(prop, NULL, "resolv");
1889   RNA_def_property_range(prop, 1, 1024);
1890   RNA_def_property_ui_range(prop, 1, 64, 1, -1);
1891   RNA_def_property_ui_text(prop, "Resolution V", "Surface subdivisions per segment");
1892   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1893
1894   prop = RNA_def_property(srna, "use_cyclic_u", PROP_BOOLEAN, PROP_NONE);
1895   RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_CYCLIC);
1896   RNA_def_property_ui_text(
1897       prop, "Cyclic U", "Make this curve or surface a closed loop in the U direction");
1898   RNA_def_property_update(prop, 0, "rna_Nurb_update_cyclic_u");
1899
1900   prop = RNA_def_property(srna, "use_cyclic_v", PROP_BOOLEAN, PROP_NONE);
1901   RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_CYCLIC);
1902   RNA_def_property_ui_text(prop, "Cyclic V", "Make this surface a closed loop in the V direction");
1903   RNA_def_property_update(prop, 0, "rna_Nurb_update_cyclic_v");
1904
1905   /* Note, endpoint and bezier flags should never be on at the same time! */
1906   prop = RNA_def_property(srna, "use_endpoint_u", PROP_BOOLEAN, PROP_NONE);
1907   RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_ENDPOINT);
1908   RNA_def_property_ui_text(
1909       prop,
1910       "Endpoint U",
1911       "Make this nurbs curve or surface meet the endpoints in the U direction "
1912       "(Cyclic U must be disabled)");
1913   RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u");
1914
1915   prop = RNA_def_property(srna, "use_endpoint_v", PROP_BOOLEAN, PROP_NONE);
1916   RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_ENDPOINT);
1917   RNA_def_property_ui_text(prop,
1918                            "Endpoint V",
1919                            "Make this nurbs surface meet the endpoints in the V direction "
1920                            "(Cyclic V must be disabled)");
1921   RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v");
1922
1923   prop = RNA_def_property(srna, "use_bezier_u", PROP_BOOLEAN, PROP_NONE);
1924   RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_BEZIER);
1925   RNA_def_property_ui_text(
1926       prop,
1927       "Bezier U",
1928       "Make this nurbs curve or surface act like a Bezier spline in the U direction "
1929       "(Order U must be 3 or 4, Cyclic U must be disabled)");
1930   RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u");
1931
1932   prop = RNA_def_property(srna, "use_bezier_v", PROP_BOOLEAN, PROP_NONE);
1933   RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_BEZIER);
1934   RNA_def_property_ui_text(prop,
1935                            "Bezier V",
1936                            "Make this nurbs surface act like a Bezier spline in the V direction "
1937                            "(Order V must be 3 or 4, Cyclic V must be disabled)");
1938   RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v");
1939
1940   prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
1941   RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_SMOOTH);
1942   RNA_def_property_ui_text(prop, "Smooth", "Smooth the normals of the surface or beveled curve");
1943   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1944
1945   prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
1946   RNA_def_property_boolean_sdna(prop, NULL, "hide", 1);
1947   RNA_def_property_ui_text(prop, "Hide", "Hide this curve in Edit mode");
1948   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1949
1950   prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
1951   RNA_def_property_int_sdna(prop, NULL, "mat_nr");
1952   RNA_def_property_ui_text(prop, "Material Index", "");
1953   RNA_def_property_int_funcs(prop, NULL, NULL, "rna_Curve_material_index_range");
1954   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1955
1956   prop = RNA_def_property(srna, "character_index", PROP_INT, PROP_UNSIGNED);
1957   RNA_def_property_int_sdna(prop, NULL, "charidx");
1958   RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
1959   RNA_def_property_ui_text(prop,
1960                            "Character Index",
1961                            "Location of this character in the text data (only for text curves)");
1962   RNA_def_property_update(prop, 0, "rna_Curve_update_data");
1963
1964   RNA_def_struct_path_func(srna, "rna_Curve_spline_path");
1965
1966   RNA_api_curve_nurb(srna);
1967 }
1968
1969 void RNA_def_curve(BlenderRNA *brna)
1970 {
1971   rna_def_curve(brna);
1972   rna_def_surface(brna);
1973   rna_def_text(brna);
1974   rna_def_textbox(brna);
1975   rna_def_charinfo(brna);
1976   rna_def_bpoint(brna);
1977   rna_def_beztriple(brna);
1978   rna_def_curve_nurb(brna);
1979 }
1980
1981 #endif