Blender  V3.3
obj_import_nurbs.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include "BKE_object.h"
8 
9 #include "BLI_math_vector.h"
10 
11 #include "DNA_curve_types.h"
12 
13 #include "importer_mesh_utils.hh"
14 #include "obj_import_nurbs.hh"
15 #include "obj_import_objects.hh"
16 
17 namespace blender::io::obj {
18 
20 {
21  std::string ob_name{curve_geometry_.geometry_name_};
22  if (ob_name.empty() && !curve_geometry_.nurbs_element_.group_.empty()) {
23  ob_name = curve_geometry_.nurbs_element_.group_;
24  }
25  if (ob_name.empty()) {
26  ob_name = "Untitled";
27  }
28  BLI_assert(!curve_geometry_.nurbs_element_.curv_indices.is_empty());
29 
30  Curve *curve = BKE_curve_add(bmain, ob_name.c_str(), OB_CURVES_LEGACY);
31  Object *obj = BKE_object_add_only_object(bmain, OB_CURVES_LEGACY, ob_name.c_str());
32 
33  curve->flag = CU_3D;
34  curve->resolu = curve->resolv = 12;
35  /* Only one NURBS spline will be created in the curve object. */
36  curve->actnu = 0;
37 
38  Nurb *nurb = static_cast<Nurb *>(MEM_callocN(sizeof(Nurb), "OBJ import NURBS curve"));
40  create_nurbs(curve);
41 
42  obj->data = curve;
43  transform_object(obj, import_params);
44 
45  return obj;
46 }
47 
48 void CurveFromGeometry::create_nurbs(Curve *curve)
49 {
50  const NurbsElement &nurbs_geometry = curve_geometry_.nurbs_element_;
51  Nurb *nurb = static_cast<Nurb *>(curve->nurb.first);
52 
53  nurb->type = CU_NURBS;
54  nurb->flag = CU_3D;
55  nurb->next = nurb->prev = nullptr;
56  /* BKE_nurb_points_add later on will update pntsu. If this were set to total curv points,
57  * we get double the total points in viewport. */
58  nurb->pntsu = 0;
59  /* Total points = pntsu * pntsv. */
60  nurb->pntsv = 1;
61  nurb->orderu = nurb->orderv = (nurbs_geometry.degree + 1 > SHRT_MAX) ? 4 :
62  nurbs_geometry.degree + 1;
63  nurb->resolu = nurb->resolv = curve->resolu;
64 
65  const int64_t tot_vert{nurbs_geometry.curv_indices.size()};
66 
67  BKE_nurb_points_add(nurb, tot_vert);
68  for (int i = 0; i < tot_vert; i++) {
69  BPoint &bpoint = nurb->bp[i];
70  copy_v3_v3(bpoint.vec, global_vertices_.vertices[nurbs_geometry.curv_indices[i]]);
71  bpoint.vec[3] = 1.0f;
72  bpoint.weight = 1.0f;
73  }
74 
76  bool do_endpoints = false;
77  int deg1 = nurbs_geometry.degree + 1;
78  if (nurbs_geometry.parm.size() >= deg1 * 2) {
79  do_endpoints = true;
80  for (int i = 0; i < deg1; ++i) {
81  if (abs(nurbs_geometry.parm[i]) > 0.0001f) {
82  do_endpoints = false;
83  break;
84  }
85  if (abs(nurbs_geometry.parm[nurbs_geometry.parm.size() - 1 - i] - 1.0f) > 0.0001f) {
86  do_endpoints = false;
87  break;
88  }
89  }
90  }
91  if (do_endpoints) {
92  nurb->flagu = CU_NURB_ENDPOINT;
93  }
94 }
95 
96 } // namespace blender::io::obj
struct Curve * BKE_curve_add(struct Main *bmain, const char *name, int type)
Definition: curve.cc:414
void BKE_nurb_points_add(struct Nurb *nu, int number)
Definition: curve.cc:915
void BKE_nurb_knot_calc_u(struct Nurb *nu)
Definition: curve.cc:1234
ListBase * BKE_curve_nurbs_get(struct Curve *cu)
Definition: curve.cc:4976
General operations, lookup, etc. for blender objects.
struct Object * BKE_object_add_only_object(struct Main *bmain, int type, const char *name) ATTR_RETURNS_NONNULL
Definition: object.cc:2241
#define BLI_assert(a)
Definition: BLI_assert.h:46
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
MINLINE void copy_v3_v3(float r[3], const float a[3])
@ CU_NURBS
@ CU_NURB_ENDPOINT
@ CU_3D
@ OB_CURVES_LEGACY
int64_t size() const
Definition: BLI_vector.hh:694
bool is_empty() const
Definition: BLI_vector.hh:706
Object * create_curve(Main *bmain, const OBJImportParams &import_params)
Curve curve
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void transform_object(Object *object, const OBJImportParams &import_params)
T abs(const T &a)
__int64 int64_t
Definition: stdint.h:89
float weight
float vec[4]
short resolv
short resolu
ListBase nurb
void * first
Definition: DNA_listBase.h:31
Definition: BKE_main.h:121
short orderu
struct Nurb * next
short orderv
short flag
short type
short resolu
struct Nurb * prev
short resolv
void * data