[Bf-blender-cvs] [15d5b87d956] temp-gpencil-io: GPencil: Compute points in render size when camera view

Antonio Vazquez noreply at git.blender.org
Wed Jan 20 12:20:10 CET 2021


Commit: 15d5b87d956a1f0da5719f77adb78f8b81c0c781
Author: Antonio Vazquez
Date:   Wed Jan 20 12:16:02 2021 +0100
Branches: temp-gpencil-io
https://developer.blender.org/rB15d5b87d956a1f0da5719f77adb78f8b81c0c781

GPencil: Compute points in render size when camera view

Now the size is constant in camera view to the render size.

===================================================================

M	source/blender/io/gpencil/intern/gpencil_io_base.cc
M	source/blender/io/gpencil/intern/gpencil_io_base.h

===================================================================

diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.cc b/source/blender/io/gpencil/intern/gpencil_io_base.cc
index 742ada3f686..2bfc436cd3d 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.cc
@@ -25,6 +25,9 @@
 #include <algorithm>
 #include <string>
 
+#include "DNA_vec_types.h"
+
+#include "BKE_camera.h"
 #include "BKE_context.h"
 #include "BKE_gpencil.h"
 #include "BKE_gpencil_geom.h"
@@ -79,6 +82,29 @@ GpencilIO::GpencilIO(const struct GpencilIOParams *iparams)
   gpd_ = (params_.ob != NULL) ? (bGPdata *)params_.ob->data : nullptr;
   cfra_ = iparams->frame_cur;
 
+  /* Calculate camera matrix. */
+  Object *cam_ob = (Object *)params_.v3d->camera;
+  if (cam_ob != NULL) {
+    RenderData *re = &scene_->r;
+    CameraParams params;
+
+    /* Setup parameters. */
+    BKE_camera_params_init(&params);
+    BKE_camera_params_from_object(&params, cam_ob);
+
+    /* Compute matrix, viewplane, .. */
+    BKE_camera_params_compute_viewplane(&params, re->xsch, re->ysch, re->xasp, re->yasp);
+    BKE_camera_params_compute_matrix(&params);
+
+    float viewmat[4][4];
+    invert_m4_m4(viewmat, cam_ob->obmat);
+
+    mul_m4_m4m4(persmat_, params.winmat, viewmat);
+  }
+  else {
+    unit_m4(persmat_);
+  }
+
   /* Load list of selected objects. */
   create_object_list();
   object_created_ = false;
@@ -243,21 +269,21 @@ void GpencilIO::gpencil_3d_point_to_project_space(const float co[3], float r_co[
 {
   float parent_co[3];
   mul_v3_m4v3(parent_co, diff_mat_, co);
+  mul_m4_v3(persmat_, parent_co);
 
-  float tmp[4];
-  copy_v3_v3(tmp, parent_co);
-  tmp[3] = 1.0f;
-  mul_m4_v4(rv3d_->viewmat, tmp);
+  parent_co[0] = parent_co[0] / max_ff(FLT_MIN, parent_co[2]);
+  parent_co[1] = parent_co[1] / max_ff(FLT_MIN, parent_co[2]);
 
-  copy_v2_v2(r_co, tmp);
+  r_co[0] = (parent_co[0] + 1.0f) / 2.0f * (float)render_x_;
+  r_co[1] = (parent_co[1] + 1.0f) / 2.0f * (float)render_y_;
 
   /* Invert X axis. */
   if (invert_axis_[0]) {
-    r_co[0] = winx_ - r_co[0];
+    r_co[0] = (float)render_x_ - r_co[0];
   }
   /* Invert Y axis. */
   if (invert_axis_[1]) {
-    r_co[1] = winy_ - r_co[1];
+    r_co[1] = (float)render_y_ - r_co[1];
   }
 }
 
diff --git a/source/blender/io/gpencil/intern/gpencil_io_base.h b/source/blender/io/gpencil/intern/gpencil_io_base.h
index d4b013ca802..c2bff0cf79a 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_base.h
+++ b/source/blender/io/gpencil/intern/gpencil_io_base.h
@@ -126,6 +126,9 @@ class GpencilIO {
   float avg_opacity_;
   bool is_camera_;
   rctf select_boundbox_;
+
+  /* Camera matrix. */
+  float persmat_[4][4];
 };
 
 }  // namespace blender::io::gpencil



More information about the Bf-blender-cvs mailing list