Blender V4.5
obj_export_nurbs.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "BLI_listbase.h"
10#include "BLI_math_matrix.h"
11#include "BLI_math_rotation.h"
12#include "BLI_math_vector.h"
14
16#include "BKE_curves.hh"
17
18#include "DEG_depsgraph.hh"
20
21#include "IO_wavefront_obj.hh"
22#include "obj_export_nurbs.hh"
23
24namespace blender::io::obj {
26 const OBJExportParams &export_params,
27 Object *curve_object)
28 : export_object_eval_(curve_object)
29{
30 export_object_eval_ = DEG_get_evaluated(depsgraph, curve_object);
31 export_curve_ = static_cast<Curve *>(export_object_eval_->data);
32 set_world_axes_transform(export_params.forward_axis, export_params.up_axis);
33}
34
35void OBJCurve::set_world_axes_transform(const eIOAxis forward, const eIOAxis up)
36{
37 float axes_transform[3][3];
38 unit_m3(axes_transform);
39 /* +Y-forward and +Z-up are the Blender's default axis settings. */
40 mat3_from_axis_conversion(forward, up, IO_AXIS_Y, IO_AXIS_Z, axes_transform);
41 mul_m4_m3m4(world_axes_transform_, axes_transform, export_object_eval_->object_to_world().ptr());
42 /* #mul_m4_m3m4 does not transform last row of #Object.object_to_world, i.e. location data. */
44 world_axes_transform_[3], axes_transform, export_object_eval_->object_to_world().location());
45 world_axes_transform_[3][3] = export_object_eval_->object_to_world()[3][3];
46}
47
48const char *OBJCurve::get_curve_name() const
49{
50 return export_object_eval_->id.name + 2;
51}
52
54{
55 return BLI_listbase_count(&export_curve_->nurb);
56}
57
58const Nurb *OBJCurve::get_spline(const int spline_index) const
59{
60 return static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
61}
62
63int OBJCurve::total_spline_vertices(const int spline_index) const
64{
65 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
66 return nurb->pntsu * nurb->pntsv;
67}
68
69float3 OBJCurve::vertex_coordinates(const int spline_index,
70 const int vertex_index,
71 const float global_scale) const
72{
73 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
74 float3 r_coord;
75 const BPoint &bpoint = nurb->bp[vertex_index];
76 copy_v3_v3(r_coord, bpoint.vec);
77 mul_m4_v3(world_axes_transform_, r_coord);
78 mul_v3_fl(r_coord, global_scale);
79 return r_coord;
80}
81
82int OBJCurve::num_control_points_u(int spline_index) const
83{
84 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
85 return nurb->pntsu + (nurb->flagu & CU_NURB_CYCLIC ? get_nurbs_degree_u(spline_index) : 0);
86}
87
88int OBJCurve::num_control_points_v(int spline_index) const
89{
90 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
91 return nurb->pntsv + (nurb->flagv & CU_NURB_CYCLIC ? get_nurbs_degree_v(spline_index) : 0);
92}
93
94int OBJCurve::get_nurbs_degree_u(const int spline_index) const
95{
96 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
97 return nurb->type == CU_POLY ? 1 : nurb->orderu - 1;
98}
99
100int OBJCurve::get_nurbs_degree_v(const int spline_index) const
101{
102 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
103 return nurb->type == CU_POLY ? 1 : nurb->orderv - 1;
104}
105
106short OBJCurve::get_nurbs_flagu(const int spline_index) const
107{
108 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
109 return nurb->flagu;
110}
111
112Span<float> OBJCurve::get_knots_u(int spline_index, Vector<float> &knot_buffer) const
113{
114 const Nurb *const nurb = static_cast<Nurb *>(BLI_findlink(&export_curve_->nurb, spline_index));
115 const short flag = nurb->flagu;
116 const int8_t order = get_nurbs_degree_u(spline_index) + 1; /* Use utility in case of POLY */
117 const bool cyclic = flag & CU_NURB_CYCLIC;
118
119 const int knot_count = bke::curves::nurbs::knots_num(nurb->pntsu, order, cyclic);
120
121 if (flag & CU_NURB_CUSTOM) {
122 return Span<float>(nurb->knotsu, knot_count);
123 }
124
125 knot_buffer.resize(knot_count);
127 nurb->pntsu, bke::knots_mode_from_legacy(flag), order, cyclic, knot_buffer);
128 return knot_buffer;
129}
130
131} // namespace blender::io::obj
Low-level operations for curves.
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:534
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:524
void unit_m3(float m[3][3])
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4])
bool mat3_from_axis_conversion(int src_forward, int src_up, int dst_forward, int dst_up, float r_mat[3][3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ CU_NURB_CYCLIC
@ CU_NURB_CUSTOM
@ CU_POLY
eIOAxis
@ IO_AXIS_Y
@ IO_AXIS_Z
BPy_StructRNA * depsgraph
void resize(const int64_t new_size)
int total_spline_vertices(int spline_index) const
const Nurb * get_spline(int spline_index) const
short get_nurbs_flagu(int spline_index) const
float3 vertex_coordinates(int spline_index, int vertex_index, float global_scale) const
int get_nurbs_degree_u(int spline_index) const
int num_control_points_u(int spline_index) const
const char * get_curve_name() const
int get_nurbs_degree_v(int spline_index) const
Span< float > get_knots_u(int spline_index, Vector< float > &buffer) const
int num_control_points_v(int spline_index) const
OBJCurve(const Depsgraph *depsgraph, const OBJExportParams &export_params, Object *curve_object)
void calculate_knots(int points_num, KnotsMode mode, int8_t order, bool cyclic, MutableSpan< float > knots)
int knots_num(int points_num, int8_t order, bool cyclic)
KnotsMode knots_mode_from_legacy(short flag)
VecBase< float, 3 > float3
float vec[4]
char name[66]
Definition DNA_ID.h:415
short flagu
short orderu
short orderv
float * knotsu
short type
BPoint * bp
short flagv
uint8_t flag
Definition wm_window.cc:139