Commit: d882a63e981e5bd4563505627bb4a9bf33b7443e
Author: Ankit Meel
Date: Fri Aug 14 14:26:41 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBd882a63e981e5bd4563505627bb4a9bf33b7443e
Apply axes transform to exportable Nurbs.
===================================================================
M source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.cc
M source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.hh
M source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
===================================================================
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.cc
b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.cc
index bbeed17513a..3f569c7cdfe 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.cc
@@ -27,17 +27,40 @@
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
+#include "IO_wavefront_obj.h"
#include "wavefront_obj_ex_nurbs.hh"
namespace blender::io::obj {
/**
* Store NURBS curves that will be exported in parameter form, not converted
to meshes.
*/
-OBJNurbs::OBJNurbs(Depsgraph *depsgraph, Object *export_object)
- : depsgraph_(depsgraph), export_object_eval_(export_object)
+OBJNurbs::OBJNurbs(Depsgraph *depsgraph,
+ const OBJExportParams &export_params,
+ Object *export_object)
+ : depsgraph_(depsgraph), export_params_(export_params),
export_object_eval_(export_object)
{
export_object_eval_ = DEG_get_evaluated_object(depsgraph_, export_object);
export_curve_ = static_cast<Curve *>(export_object_eval_->data);
+ store_world_axes_transform();
+}
+
+/**
+ * Store the product of export axes settings and an object's world transform
matrix in
+ * world_and_axes_transform[4][4].
+ */
+void OBJNurbs::store_world_axes_transform()
+{
+ float axes_transform[3][3];
+ unit_m3(axes_transform);
+ /* -Y-forward and +Z-up are the default Blender axis settings. */
+ mat3_from_axis_conversion(OBJ_AXIS_NEGATIVE_Y_FORWARD,
+ OBJ_AXIS_Z_UP,
+ export_params_.forward_axis,
+ export_params_.up_axis,
+ axes_transform);
+ mul_m4_m3m4(world_axes_transform_, axes_transform,
export_object_eval_->obmat);
+ /* mul_m4_m3m4 does not copy last row of obmat, i.e. location data. */
+ copy_v4_v4(world_axes_transform_[3], export_object_eval_->obmat[3]);
}
const char *OBJNurbs::get_curve_name() const
@@ -55,10 +78,11 @@ const ListBase *OBJNurbs::curve_nurbs() const
*/
void OBJNurbs::calc_point_coords(const Nurb *nurb, const int vert_index, float
r_coords[3]) const
{
- // TODO ankitm add world transform.
BPoint *bpoint = nurb->bp;
bpoint += vert_index;
copy_v3_v3(r_coords, bpoint->vec);
+ mul_m4_v3(world_axes_transform_, r_coords);
+ mul_v3_fl(r_coords, export_params_.scaling_factor);
}
/**
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.hh
b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.hh
index 74ad9666a5a..c471bd1c128 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_nurbs.hh
@@ -34,16 +34,21 @@ namespace blender::io::obj {
class OBJNurbs : NonMovable, NonCopyable {
private:
const Depsgraph *depsgraph_;
+ const OBJExportParams &export_params_;
const Object *export_object_eval_;
const Curve *export_curve_;
+ float world_axes_transform_[4][4];
public:
- OBJNurbs(Depsgraph *depsgraph, Object *export_object);
+ OBJNurbs(Depsgraph *depsgraph, const OBJExportParams &export_params, Object
*export_object);
const char *get_curve_name() const;
const ListBase *curve_nurbs() const;
void calc_point_coords(const Nurb *nurb, int vert_index, float r_coords[3])
const;
void get_curve_info(const Nurb *nurb, int &r_nurbs_degree, int &r_curv_num)
const;
+
+ private:
+ void store_world_axes_transform();
};
} // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
index 7ca7a1405b8..2b4b01b826f 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
@@ -73,8 +73,8 @@ static void find_exportable_objects(ViewLayer *view_layer,
case CU_NURBS: {
if (export_params.export_curves_as_nurbs) {
/* Export in parameter form: control points. */
- r_exportable_nurbs.append(
- std::unique_ptr<OBJNurbs>(new OBJNurbs(depsgraph,
object_in_layer)));
+ r_exportable_nurbs.append(std::unique_ptr<OBJNurbs>(
+ new OBJNurbs(depsgraph, export_params, object_in_layer)));
}
else {
/* Export in mesh form: edges and vertices. */
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs