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

Reply via email to